私は.Netネイティブコンパイラによって実行される最適化技術に取り組んでいます。 私は、サンプルループ作成しました:.Netネイティブコンパイルループが逆の順序であるのはなぜですか?
for (int i = 0; i < 100; i++)
{
Function();
}
をそして私はネイティブでそれをまとめました。それから、IDAにある.dll
のファイルをマシンコードで解体しました。その結果、私が持っている:
(私はいくつかの不要な行を削除したので、そのアドレスラインがinconsistantです心配しないでください)
私は、add esi, 0FFFFFFFFh
は本当にsubtract one from esi and alter Zero Flag if needed
を意味することを理解しますまだゼロに達していなければ、最初にジャンプすることができます。
私は理解していないことは、なぜコンパイラはループを反省したのですか?
私は
LOOP:
add esi, 0FFFFFFFFh
jnz LOOP
はただ速い例えばより
LOOP:
inc esi
cmp esi, 064h
jl LOOP
である。しかし、それはそのため実際にあると、本当に大きな速度差であるという結論に来ましたの?
即時値を持つADDはINCより高速です。また、これらのすべてを3行のコードでスキップします。次に、違いは本当に重要です(サイズとスピードの両方)。現実世界のプログラムで約30000の場所でこれを行うとしたら... –
これは高速で一般的なオプティマイザは、プログラムのセマンティクスを変更することなくコードを高速化するあらゆる最適化を適用します。 –
逆方向に関しては、おそらくゼロとの比較が特定の値との比較よりも速いでしょうか? – user5226582