如果比较功能相同的几组代码的运行速度, 可以使用ruby语言里的Benchmark模块。
下面举个例子:
连接两个字符串,如:
str1 = "上海"
str2 = "世博会"
可以使用+
str1 + str2 # => 上海世博会
也可以使用
"#{str1}#{str2}" # => 上海世博会
还可以使用<<(会改变str1的值)
str1 << str2 # => 上海世博会
如果想要知道这三种方法哪一个速度更快,就可以使用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(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方式,所以会有两个结果。第一个是演习结果,第二个是真实结果。如果使用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)