用Benchmark測試不同ruby代碼的運行速度

如果比較功能相同的幾組代碼的運行速度, 可以使用ruby語言里的Benchmark模塊.
(開始前 設置中文環境, $KCODE = ‘u’)
比如, 連接兩個字串, 如:
str1 = "中國"
str2 = "一定強!!!"

可以使用+
?> str1 + str2
=> "中國一定強!!!"
也可使用
>> "#{str1}#{str2}"
=> "中國一定強!!!"
還可以使用<<
>> str1 << str2
=> "中國一定強!!!"
(注意這種方法會改變str1的值,
>> str1
=> "中國一定強!!!")

如果想要知道這三種方法哪一個速度更快, 就可以使用Benchmark比較.
先定義三個不同的方法:

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

因為這三種方法速度都很快, 比較一次的時間很難分出上下, 所以每種方法都做500000次.
因為<< 會改變變量, 所以在第三個方法中使用了str_a.dup, 備份出一個str_a來測試, 其它二個方法雖然從理論上不須要這個dup, 但為了時間上的公平, 也給它們加上了.

下面是測試代碼:
require ‘benchmark’

Benchmark.bmbm(10) do |t|
  t.report(‘加號連接’) { joined_by_plus(str1, str2) }
  t.report(‘放進引號’) { joined_by_uniting(str1, str2)}
  t.report(‘使用<<’) { joined_by_adding(str1, str2)}
end

bmbm是Benchmark的測試方法, 這是雙重測試, 用來提高精確度. 裡面參數10用來調節標籤在結果里的顯示佔位寬度, 不對結果產生影響.
report(‘加號連接’)里的參數是為相應測試的標籤名, 用來區別測試結果.

下面就是結果:

Rehearsal ————————————————
加號連接   1.800000   0.580000   2.380000 (  2.435614)
放進引號   2.080000   0.590000   2.670000 (  2.706669)
使用<<       2.000000   0.580000   2.580000 (  2.635540)
————————————— total: 7.630000sec

                   user     system      total        real
加號連接   1.810000   0.600000   2.410000 (  2.476613)
放進引號   2.050000   0.600000   2.650000 (  2.656080)
使用<<       1.960000   0.600000   2.560000 (  2.567434)

因為使用了bmbm方式, 所以會有兩個結果, 第一個是演習結果, 第二個是真實結果.  如果使用bm方法, 將只會有一組結果.
結果有user時間, 系統時間, 總時間和實際花費的時間. 單位為秒.

從結果可以看出, 使用+連接兩個字串時速度最快, 而放進引號的方法最慢. 不過從結果也可以看出即使進行500000執行的結果也相差在0.3秒之內, 平時換用問題不大.

看來不是這一次, 希望下次你在自己的Benchmark試驗中, 會發現給你的程序帶來巨大速度提供的代碼.

轉載請註明: 轉自船長日誌, 本文鏈接地址: http://www.cslog.cn/Content/ruby_benchmark/zh-hant/

此條目發表在 Ruby on Rails 分類目錄。將固定鏈接加入收藏夾。

發表評論

電子郵件地址不會被公開。 必填項已用 * 標註

*

您可以使用這些 HTML 標籤和屬性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>