Оставляя в стороне такие вещи, как тот факт, что вы создаете множество объектов во втором цикле, что может легко вызвать сборку мусора в пределах fn()
или что-то еще до на самом деле , что заставит это занять больше времени во время синхронизации, вы также просто берете истекшие миллисекунды каждой итерации во втором случае.
Предположим, что каждая итерация занимает 0,1 миллисекунды. Ваша общая сумма для второго цикла будет равна 0, потому что на каждой итерации она будет округлять истекшее время до 0 миллисекунд. Первый цикл отслеживает прошедшие тики .
Если оставить все это в стороне, вам все равно не следует запускать и останавливать таймер так часто - он будет портить ваши результаты. Вместо этого запустите секундомер один раз перед циклом и остановите его после цикла.
Если вы хотите снять накладные расходы цикла, просто найдите пустой цикл , чтобы найти накладные расходы, и вычтите их из времени, затраченного на цикл, содержащий фактическую работу. Теперь это не совсем 1018 * совсем так просто, из-за различных сложностей реальных процессоров - таких вещей, как отсутствие кеша - но откровенно говоря, микробенчмаркинг никогда не особенно точен в этом отношении. Его следует использовать как руководство больше всего на свете.