パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

もうやらなくていい昔のコーディングテクニックあれこれ」記事へのコメント

  • by kicchy (4711) on 2009年05月04日 13時18分 (#1558978)

    RENUM
    あとは、行番号にルーチンの固まり毎で帯域を作ったりとか
    FORループのNEXTは、変数を書かない方が速いとか。

    # って、BASIC毎にちょっとずつ違うのかな?

    • by xsd (25734) on 2009年05月04日 13時35分 (#1558984) 日記

      昔のBASICの高速化のテクニック(?)として、

      ・プログラムの最初でDEFINT A-Z
      ・よく実行されるコードは最初の方においておく (行番号を先頭から線形探索しているから?)
      ・変数名は短くする
      ・複数行はマルチステートメント化する
      ・IF I=29 THEN X=X+1 ELSE IF I=30 THEN X=X-1の代わりにX=X+(I=30)-(I=29)とする。

      とかいうのを思い出しました。

      親コメント
      • by Anonymous Coward on 2009年05月04日 15時42分 (#1559053)
        > ・IF I=29 THEN X=X+1 ELSE IF I=30 THEN X=X-1の代わりにX=X+(I=30)-(I=29)とする。

        MSX-BASICだと、かえって遅くなるんですよ、これ。
        他のBASIC実装だと、速かったんでしょうか?
        親コメント
        • by xsd (25734) on 2009年05月04日 17時03分 (#1559088) 日記

          NEC系は確か速くなったはず、と思ってN88-BASICで確かめてみると、IFを使う場合が10000回で29秒であったのに対して、論理式の方は10000回で33秒となりかえって遅くなってました。
          これは高速化のための方法ではなく、N60のようなIF構文が弱い(ELSEが使えない)場合に書きやすいって話だったのかもしれません。

          親コメント
          • by nyagy (17036) on 2009年05月04日 20時50分 (#1559206)

            条件によって処理速度がばらつかないようにという理由もあったように思います。
            例のコードみたいなのって、入力に従ってキャラクタを上下左右に動かすとかだったりするんだけど、IFの羅列で書くと、上への移動と下への移動の速度が違うなんて現象が起こってしまうとか。

            親コメント
          • by Anonymous Coward
            n画面プログラムとかの投稿のレギュレーションに合わせるためだろ。常考。
        • Re:BASICあつまれー (スコア:2, おもしろおかしい)

          by docile-jp (16652) on 2009年05月05日 11時51分 (#1559438) 日記

          NS-HU BASIC で、メモリ節約するのにそれをやるというのがあったような。
          (コントローラ入力あたりの処理で)

          --
          ええファミリーベーシックですよ

          親コメント
      • by Dobon (7495) on 2009年05月04日 16時36分 (#1559077) 日記
        |よく実行されるコードは最初の方においておく

        それ、HuBASICやS-BASICだと意味ないです。
        (1回実行された部分はポインタに置換されてしまうから)

        # BASIC処理系は末期にはインタプリタなんだかコンパイラなんだか判らないものになっていましたね…
        --
        notice : I ignore an anonymous contribution.
        親コメント
      • by backyarD (36899) on 2009年05月05日 1時23分 (#1559315) 日記

        ・複数行はマルチステートメント化する

        昨年の夏まで、これを徹底させる親分が居るプロジェクトに居ました。
        (VB.NET 2003)

        高速化のテクニックだったのですね。やっと意味が分かりましたよ。

        親コメント
    • by nmaeda (5111) on 2009年05月04日 15時38分 (#1559045)

      それらは実装次第だから、処理系によるね。

      例えば、For ~ Next ~は、Fortran時代からよく語られたテクニックだけど、ちゃんと最適化していたら違いはないはずだからね。

      親コメント
      • by Anonymous Coward

        BASICが8ビット機にインタプリタで実装されていたことをお忘れなく。
        > ちゃんと最適化
        するコストすらとうてい無視し得なかったのです。メインフレームなどでコンパイルされるFortranのテクニックとしては無意味だったかもしれませんが。

    • シャープのX1で、キャラクタ用のRAMをキャッシュに使うなんてのもありましたねぇ。

      --
      〜◍
      親コメント
      • by sadole (27157) on 2009年05月04日 18時25分 (#1559137)

        X68kだとそれが更に進化?して、外字領域やsprite、GRAMなどありとあらゆる領域がRAMDISK化されてましたね。
        (大事なデータは置けない恐怖の領域ですが…)

        まさに今はやらなくていい技術かも。

        親コメント
      • by Anonymous Coward

        X1のBASICはGVRAMをRAMDISKにする命令を持ってましたね。
        たった48kとはいえ、テープ環境では通信のUploadファイルを置いたりするのに便利でした。

        自前でキャッシュを用意するなんてのも、不要な技術になりましたねぇ。
        ずっと昔、まだPC-9801の最新機種がi386搭載とか言っていた頃に、神剣蝉だったかそんな名前だった会社の仕事をやりましたが
        FDのデータを拡張VRAMにキャッシュしたら約30倍の速度向上があって、これは喜ばれました。
        今ではただ懐かしいだけの、何の役にも立たないテクニックですな。

        • >自前でキャッシュを用意するなんてのも、不要な技術になりましたねぇ。
          HDD上に構成したGbyte単位の配列の操作なんかは、自前キャッシュは非常に有効です。OS(Windows)のキャッシングを防ぐために FILE_FLAG_NO_BUFFERING でオープンし、別threadで先読みなんてことをやると、ものすごく速くなることがあります。
          親コメント
          • by Anonymous Coward
            別スレッドを使わずに非同期I/Oを使ってください。おながいします。
            Windows2000まではアレでしたがXP以降は良好に動作しますよ。
    • by beatnik (31424) on 2009年05月04日 23時42分 (#1559279)
      文字変数のGCが起きないように、左辺の mid$ を使っているコードを見て衝撃を受けたのを思い出した。

      A$ = "Initialized"
      ...
      A$ = "Initialized" + "hoge"

      なんてのを

      A$ = STRING$(" ", 254)
      ...
      mid$(A$, 1, 11) = "Initialized"
      ...
      mid$(A$, 12, 4) = "hoge"

      みたいな。 たしかに、酷い時は何秒も停止してたなと > GC

      親コメント
    • MZ-80B/2000での話。
      ゲームで必須の技であるキーのオートリピート設定を
      あの機種はあるメモリアドレスをPOKEすることで行っていた。
      なのでrunしてゲーム中にBreakしてプロンプトに戻ってくると
      その設定が解除されておらず
      LISTと普通に打つと
      LLLLLLLLLLLLLIIIIIIIIIIIIISSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTT
      などということになる。当時珍しいRAMにLOADするBASICインタプリタだったから
      ちょっと電源切って、なんてこともやりたくない。(カセットからLOADするだけで数分無駄にする)

      どうするかというと、F7とかF5キーあたりに
      キーリピート設定を解除するPOKEコマンドを仕込んでおき、
      抜けてきたらおもむろに押すという…。

      コーディングテクニックと言うべきかどうか微妙だけども。

      親コメント
    • 友人が見つけた、F-BASIC N88ともに使えた技で、
      一行255文字に制限されているけど、これは言語の制限ではなくてエディタの制限なので、マルチステートメントで一行にできるところは、行番号を取っ払って一行にすると、速くてコンパクトなプログラムになりました。

      # 画面全部で一行とか。編集できなくなりますが。
      親コメント

ナニゲにアレゲなのは、ナニゲなアレゲ -- アレゲ研究家

処理中...