如果比較功能相同的幾組代碼的運行速度, 可以使用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試驗中, 會發現給你的程序帶來巨大速度提供的代碼.