所以今天早上我决定第一次玩基准测试。
我很好奇具有“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)
对我来说,这看起来与我的预期完全相反。我熟悉分支预测的概念。这是分支预测的经典例子吗?如果不是,那是什么?有没有办法防止这样的不准确(如果这甚至被认为是一个)?
编辑:经过一些建议,我确实运行了这段代码超过 30 次。通常它会在两个结果之间交替。数据样本可在此处找到:
gist.github.com/TheLarkInn/5599676