Полный код здесь: 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 мс.