用Benchmark测试不同ruby代码的运行速度(一)

如果比较功能相同的几组代码的运行速度, 可以使用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)

 

你可能感兴趣的:(Ruby)