Итак, этим утром я решил поиграть с бенчмаркингом в первый раз.Точность бенчмаркинга Ruby - Профилактика ветви на ее самом лучшем?
Мне было интересно узнать о скорости, отличной от кода с форматированием блока «do-end» против форматирования «{}».
Так что я сохранил Benchmark код в Proc, так что я мог бы назвать его несколько раз подряд:
n = 100_000_000
bmp = Proc.new do
Benchmark.bm do |x|
x.report {n.times {a = "1"}}
x.report {n.times do; a = "1"; end}
end
end
Мои результаты мы ожидали, когда я побежал один раз.
>> bmp.call
user system total real
1.840000 0.030000 1.870000 ( 1.874507)
1.860000 0.050000 1.910000 ( 1.926101)
=> true
Но затем снова запустил его.
>> bmp.call
user system total real
1.870000 0.050000 1.920000 ( 1.922810)
1.840000 0.000000 1.840000 ( 1.850615)
Для меня это выглядит как полная противоположность тому, что я ожидаю. Я знаком с концепцией отраслевого предсказания. Является ли это классическим примером отраслевого прогноза? Если нет, то что? Есть ли способ предотвратить любые неточности, подобные этому (если это даже считается одним)?
EDIT: Я использовал этот код более 30 раз, после некоторых предложений. Часто он чередовался между двумя результатами. Образец данных здесь:
gist.github.com/TheLarkInn/5599676
Я скопировал ваш код и провел его сам, 30 раз, и не получал строгого чередования между результатами. Как двоичная строка (где 1 подтверждает вашу гипотезу о '{}' как-то быстрее, а 0 опровергает ее), я получил «00 11 10 00 10 10 01 00 11 01 00 11 11 00 11», что выглядит довольно случайным образом me –