C++ - крайне странное поведение машинного кода

Полный код здесь: http://pastebin.com/MM3vWmqA

В функции fast_generator я добавил комментарии к двум операторам. Если вы переключите эти операторы, код будет работать примерно в 1,8 раза быстрее. Если вы удалите первый оператор, код будет работать быстрее, чем исходная версия, но медленнее, чем если бы они были переключены.

Тестовые случаи должны быть следующими.

Первый — самый медленный. 452 мс.

counter++;
i--;

Второй - быстрее первого. 280 мс.

i--;
counter++;

Третий - быстрее первого, но медленнее второго. 421 мс.

i--;

Вывод ассемблера для исходных операторов:

inc edx
mov eax, 6

Я проверил, что при переключении этих операторов вывод ассемблера остается прежним, с той лишь разницей, что эти ассемблерные инструкции меняются местами.

Я тестировал его с VC++10 и VC++11, то же самое. Может кто-нибудь объяснить, почему переключение этих операторов ускоряет алгоритм примерно в 1,8 раза? Если вы считаете, что std::clock() неточен, измените размер = 7. На моей машине разница с размером = 7 составляет 12000 мс против 7000 мс.

7
задан NFRCR 4 April 2012 в 22:25
поделиться