« 腹が弱い、というより牡蠣に弱いだけか。 | Main | 単なる衒学だけど。 »

2006年03月29日(水)

-O6

最近のCPUはパイプライン処理が当たり前である。パイプライン処理は、今実行している処理の次の処理もあらかじめ処理しておいて速度を稼ぐ方法である。もちろん見切り発車なので、次の処理を間違うこともある。例えば、分岐処理の判定により予想と違った処理に飛んだ場合など。このときは見込みでやっていた処理を捨てて正しい処理を一からやり直す必要がある。行列の出来たレジにならんでいて会計寸前で思い出した買い物を買いに列を離れたため、レジの列がストップしているような状態になる。この現象はパイプラインストールと呼ばれ、速度が遅くなる原因となる。つまりこの現象がなるべく起きないようにするのが高速化のテクニックなのである。そんなわけで、分岐処理1行より分岐を使わない処理10行の方が速いといった現象も起こる。例えば2つの数値の大きいほうを選ぶ処理は、

(x > y)? x: y

と書くのが普通だが、

y + ((-(((x - y) >> 31) + 1)) & (x - y))

と書いたほうが速い場合もある。つーか、こんなコードよく考え付くな。

Posted by awa at 2:12.39
Categories: 雑記