Benchmarkで異なるrubyコードの実行速度をテストする(一)

2816 ワード

機能が同じ数組のコードの実行速度を比較すると、ruby言語のBenchmarkモジュールを使用できます.
 
次に例を示します.
 
次のような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)