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

前置インクリメント(++x) よりも後置インクリメント(x++) のほうが高速?」記事へのコメント

  • by Anonymous Coward on 2015年04月19日 17時36分 (#2800120)

    286時代は前置の方が早いと聞いていたので、前置が習慣になった。
    今時パソコン向けならどっちでもいいと思うけどね。

    • by taka2 (14791) on 2015年04月20日 14時14分 (#2800562) ホームページ 日記

      68000使いだと、
      デクリメントは前置、
      インクリメントは後置、
      ですね。

      スタックの処理は通常、
      push時: スタックポインタをデクリメントしてから、スタックポインタの指すメモリに書き込み
      pop時: スタックポインタの指すメモリを読み込んでから、スタックポインタをインクリメント
      という処理になります。
      で、スタック処理を高速化するために、68000ではこれらの処理は一命令で処理できるようになっていました。

      でもって、68000はスタックポインタも汎用レジスタの一つ、という直交性の高い設計なので、汎用レジスタに対しても前置デクリメントと後置インクリメントは一命令で処理できるからちょっと速い。
      #正確に言えば、アドレスレジスタについての話なので、「*--p」「*p++」が一命令処理。

      親コメント
    • by Anonymous Coward

      286時代は単純にアセンブラコードで比較できましたよね。
      今はパイプラインにスレッドにマルチコアなんかを考えると単純比較出来無いので難しいですよ。

      • by Anonymous Coward

        20年もの前の話ですが新卒で入った会社に凄腕エンジニアがいてその方がMicrosoft C/C++のPentium向け最適化をみて「人間がアセンブラでごりごりやる時代は終わったね」と言っていたのが印象に残っています。自分のスタイルにものすごく影響を与えた一言。

        • by Anonymous Coward on 2015年04月20日 6時34分 (#2800351)

          無駄は無駄なのだが、今でもそういう無駄な作業を一度は経験してみるのは無駄ではない
          プロセッサの性能が上がって今はインタプリタ言語で結構大掛かりな処理をする機会も多いが、そういうインタプリタのコードを人手で最適化をする時にその無駄な経験が役に立つ
          #インタプリタは遅いからと言って簡単に放り投げてしまう人もいるが、ほんのちょっとしたオプティマイズで劇的に速度が改善されることもあるのよ

          親コメント
          • by Anonymous Coward

            JITコンパイラ含めてオプティマイザ自体は人間が作るわけですから一般的に無駄な作業を経験する必要がある領域があるのはわかります。
            ただそれはすべてのプログラマが経験する必要はないですよね。
            そういう根っこレベルを構築できる人がただコードを書くだけの人より評価されるようになってほしいと思ってます。(給与面への反映とか)

    • by Anonymous Coward
      私もこれ。
      コンパイルすると、++i は、inc
      i++ は、addになって
      クロック数はaddの方が多いので、++iで書けるところは、++iで書くように!
      と先輩に教わった。
      今は、コンパイラが最適化してくれそうなので、どっちでもいい。

Stay hungry, Stay foolish. -- Steven Paul Jobs

処理中...