Запуск кода только один раз не надежен для бенчмаркинга. Ваш код (после исправления main
для возврата int
) выполняется на моей машине менее чем за микросекунду (используя -O2
, поскольку он должен быть оптимизирован).
Если я изменю его для запуска кода 100000 раз, я получу результаты, что sortStack
быстрее, чем sortStackRevisited
, независимо от того, в каком порядке они выполняются.
Бег sortStack
сначала: 30141 32997
Бег sortStackRevisited
сначала: 31244 26642
Даже здесь вы можете увидеть разницу при запуске только 100 тыс. Тестов. Это все еще не очень точное время.
Итак, я предполагаю, что вы запускаете неоптимизированный код и выполняете только один прогон, который может иметь всевозможные артефакты, вызывающие проблемы с результатами. Одним из них является то, что вы измеряете результаты в реальном времени, а не процессорное время, что означает, что все, что ОС выдает на ЦП, на которых выполняется код, приведет к замедлению работы в реальном времени, даже если время ЦП будет таким же. Или может привести к тому, что кэш процессора будет обрабатывать вещи по-другому, или тому, или другому. Есть много возможностей.
Кроме того, неоптимизированный код на моей машине работает в 20 раз медленнее, чем оптимизированный, что показывает, что компилятор может многое сделать, чтобы улучшить ситуацию и повлиять на конечный результат.
Но запуск, например, миллион раз, даст сравнительно хороший результат при сравнении их друг с другом. Оба значения будут различаться, но по сравнению друг с другом они останутся более одинаковыми. Например, на моей машине время, разделенное на другое, составляет 1.139-1.142, поэтому совершенно очевидно, что другой метод работает на 14% медленнее. Если я сделаю всего 10 запусков, то результат будет на 200% медленнее. С 1000 пробегами это на 12-28% медленнее. Так что больше попыток приносит больше точности, как говорит статистика.