Benchmarkで異なるrubyコードの実行速度をテストする(一)
2816 ワード
機能が同じ数組のコードの実行速度を比較すると、ruby言語のBenchmarkモジュールを使用できます.
次に例を示します.
次のような2つの文字列を接続します.
str 1=「上海」str 2=「万博」
+を使用可能
使用することもできます
<<(str 1の値が変わる)を使用することもできます.
この3つの方法のどちらが速いかを知りたければ,Benchmarkを用いて比較することができる.
まず、3つの異なる方法を定義します.
この3つの方法はいずれも速度が速く、1回の時間を比較すると上下を区別するのが難しいので、それぞれの方法で500000回やります.
<<変数が変わるので、3つ目の方法でstr_を使用しましたa.dup、str_をバックアップa試験に来て、他の2つの方法は理論的にこのdupを必要としないが、時間的な公平のために、それらに加えた.
次はテストコードです.
bmbmはBenchmarkの試験方法であり,精度を向上させるための二重試験である.内側のパラメータ10は、結果におけるラベルの表示占有幅を調整するために用いられ、結果に影響を及ぼさない.Report()のパラメータは、対応するテストのラベル名であり、テスト結果を区別します.
テスト結果は次のとおりです.
bmbm方式を使用しているので、2つの結果が得られます.1つ目は演習の結果で、2つ目は真実の結果です.bmメソッドを使用すると、結果のセットしかありません.次のようになります.
次に例を示します.
次のような2つの文字列を接続します.
str 1=「上海」str 2=「万博」
+を使用可能
str1 + str2 # =>
使用することもできます
"#{str1}#{str2}" # =>
<<(str 1の値が変わる)を使用することもできます.
str1 << str2 # =>
この3つの方法のどちらが速いかを知りたければ,Benchmarkを用いて比較することができる.
まず、3つの異なる方法を定義します.
def joined_by_plus(str_a, str_b)
500000.times do
str_a.dup + str_b
end
end
def joined_by_uniting(str_a, str_b)
500000.times do
"#{str_a.dup}#{str_b}"
end
end
def joined_by_adding(str_a, str_b)
500000.times do
str_a.dup << str_b
end
end
この3つの方法はいずれも速度が速く、1回の時間を比較すると上下を区別するのが難しいので、それぞれの方法で500000回やります.
<<変数が変わるので、3つ目の方法でstr_を使用しましたa.dup、str_をバックアップa試験に来て、他の2つの方法は理論的にこのdupを必要としないが、時間的な公平のために、それらに加えた.
次はテストコードです.
require 'benchmark'
Benchmark.bmbm(10) do |t|
t.report(Iconv.conv("GBK//IGNORE", "UTF-8//IGNORE", " ")) { joined_by_plus(str1, str2) }
t.report(Iconv.conv("GBK//IGNORE", "UTF-8//IGNORE", " ")) { joined_by_uniting(str1, str2)}
t.report(Iconv.conv("GBK//IGNORE", "UTF-8//IGNORE", " <<")) { joined_by_adding(str1, str2)}
end
bmbmはBenchmarkの試験方法であり,精度を向上させるための二重試験である.内側のパラメータ10は、結果におけるラベルの表示占有幅を調整するために用いられ、結果に影響を及ぼさない.Report()のパラメータは、対応するテストのラベル名であり、テスト結果を区別します.
テスト結果は次のとおりです.
Rehearsal ---------------------------------------------
1.781000 0.016000 1.797000 ( 1.953000)
2.297000 0.062000 2.359000 ( 2.359000)
<< 1.688000 0.016000 1.704000 ( 1.719000)
------------------------------------ total: 5.860000sec
user system total real
1.750000 0.000000 1.750000 ( 1.875000)
2.172000 0.015000 2.187000 ( 2.297000)
<< 1.469000 0.016000 1.485000 ( 1.703000)
bmbm方式を使用しているので、2つの結果が得られます.1つ目は演習の結果で、2つ目は真実の結果です.bmメソッドを使用すると、結果のセットしかありません.次のようになります.
user system total real
1.812000 0.047000 1.859000 ( 1.984000)
2.235000 0.016000 2.251000 ( 2.266000)
<< 1.718000 0.031000 1.749000 ( 1.750000)