そこで今朝、初めてベンチマークをいじってみることにしました。
「do-end」ブロック形式と「{ }」形式のコードの速度の違いに興味がありました。
そこで、ベンチマーク コードを 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)
私には、これは私が期待しているものとは正反対のように見えます。分岐予測の概念に精通しています。これは分岐予測の典型的な例ですか? そうでない場合は、何ですか?このような不正確さを防ぐ方法はありますか (これが 1 つと見なされる場合でも)?
編集:いくつかの提案の後、このコードを30回以上実行しました。多くの場合、2 つの結果が交互に表示されます。データのサンプルは次の場所にあります。
gist.github.com/TheLarkInn/5599676