Я работаю над методами оптимизации, выполняемыми компилятором .NET Native. Я создал образец цикла:
for (int i = 0; i < 100; i++)
{
Function();
}
И я скомпилировал его с помощью Native. Затем я дизассемблировал полученный .dll
файл с машинным кодом внутри в IDA. В итоге имею:
(Я удалил несколько ненужных строк, так что не беспокойтесь, что адресные строки несовместимы)
Я понимаю, что 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
Но так ли это из-за этого и действительно ли разница в скорости значительна?
i
, поэтому он может генерировать меньше кода. - person Hans Passant   schedule 05.04.2016