アカウント名:
パスワード:
b = a[i++] みたいな場合、 まず a[i] の中身を取りに行く もう i は参照しちゃったので、i は変更可 a[i] の中身を取りに行きながら、並行して i もインクリメント => 速い
だけど、b = a[++] だと まず i をインクリメント インクリメントが終わらなきゃ、どこにアクセスしていいか分からない 並行不可 => 遅い
for( ほげ; ふが; i++) とか for( ほげ; ふが; ++i) の場合 コンパイラが最適化しちゃうので、どっちも同じ
結論: 習慣化する (≒考えずにやる) なら、後置で。
ループとかだと初期値を増減するだけで本質的に同じ動作にできますよ。
それは本質的に同じ事をやることになるからです。
「並列不可」が、ループしている部分の冒頭で起こるか、末尾で起こるかの差しか生じません
b = a[i++]→iのインクリメントとa[i]を取ってくるのが並列可能b = a[++i]→a[i]を取ってくるのと、次回のiのインクリメントが並列可能
ですから、差が出るとしても、ループの1回目冒頭と最終回の直後のみで微々たる差にしかならない上、その差も、多くはコンパイラが最適化して消し去ってくれるはずです。
ですので、「早い方の書き方になるようにループの始め方を工夫してiを-1からスタートして...」といった努力は無駄に終わるでしょう。変則的な事はせず、スッキリ分かりやすい方のコードで書いた方が良いです。
インデックスインクリメント付き配列アクセスに進入する直前にその処理を実行するか否かのストールが発生したりすると直撃しますよ。ゲームでボトルネックになるくらい回る場所では意外とありがちな処理なので、ぶち当たる人はぶち当たるTipsだと思う。CPUにもよるし、ホントいろいろな意味で状況次第だけど。
そのパターンに思い至っておらず、別のツリーで似たような指摘を受けて試してみた [srad.jp]んですが、確かに影響しますね。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
あと、僕は馬鹿なことをするのは嫌いですよ (わざとやるとき以外は)。-- Larry Wall
こういうこと? (スコア:2)
b = a[i++] みたいな場合、
まず a[i] の中身を取りに行く
もう i は参照しちゃったので、i は変更可
a[i] の中身を取りに行きながら、並行して i もインクリメント => 速い
だけど、b = a[++] だと
まず i をインクリメント
インクリメントが終わらなきゃ、どこにアクセスしていいか分からない
並行不可 => 遅い
for( ほげ; ふが; i++) とか for( ほげ; ふが; ++i) の場合
コンパイラが最適化しちゃうので、どっちも同じ
結論: 習慣化する (≒考えずにやる) なら、後置で。
Re: (スコア:1)
Re: (スコア:2)
ループとかだと初期値を増減するだけで本質的に同じ動作にできますよ。
Re: (スコア:0)
それは本質的に同じ事をやることになるからです。
「並列不可」が、ループしている部分の冒頭で起こるか、末尾で起こるかの差しか生じません
b = a[i++]→iのインクリメントとa[i]を取ってくるのが並列可能
b = a[++i]→a[i]を取ってくるのと、次回のiのインクリメントが並列可能
ですから、差が出るとしても、ループの1回目冒頭と最終回の直後のみで微々たる差にしかならない上、
その差も、多くはコンパイラが最適化して消し去ってくれるはずです。
ですので、「早い方の書き方になるようにループの始め方を工夫してiを-1からスタートして...」といった努力は無駄に終わるでしょう。
変則的な事はせず、スッキリ分かりやすい方のコードで書いた方が良いです。
Re: (スコア:0)
インデックスインクリメント付き配列アクセスに進入する直前にその処理を実行するか否かのストールが発生したりすると直撃しますよ。
ゲームでボトルネックになるくらい回る場所では意外とありがちな処理なので、ぶち当たる人はぶち当たるTipsだと思う。
CPUにもよるし、ホントいろいろな意味で状況次第だけど。
Re:こういうこと? (スコア:0)
そのパターンに思い至っておらず、別のツリーで似たような指摘を受けて試してみた [srad.jp]んですが、確かに影響しますね。