使用ruby-prof来获得“1 + 1”和“1x2”之间的运行时差异

时间:2011-12-02 16:02:39

标签: ruby performance-testing ruby-prof

尝试使用Ruby和gem ruby​​-prof来描述“1 + 1”和“1x2”之间运行时间的差异。

安装gem并将一些似乎有效的代码整合在一起,但是没有给出我正在寻找的答案,这是运行时的差异。

这是可能的,如果可以,那么代码会给我这个答案。


此代码似乎有效,但不允许我看到运行时差异。


require 'ruby-prof'

result = RubyProf.profile do
1+1
end
printer = RubyProf::GraphPrinter.new(result)

result = RubyProf.profile do
1x2
end
printer = RubyProf::GraphPrinter.new(result)

在IRB中返回此内容


irb(main):001:0> require 'ruby-prof'
=> true
irb(main):002:0>
irb(main):003:0* result = RubyProf.profile do
irb(main):004:1* 1+1
irb(main):005:1> end
=> #<RubyProf::Result:0x11050c8>
irb(main):006:0> printer = RubyProf::GraphPrinter.new(result)
=> #<RubyProf::GraphPrinter:0x1332c18 @result=#<RubyProf::Result:0x11050c8>, @ou
tput=nil, @options={}, @thread_times={6793716=>0.01}>
irb(main):007:0>
irb(main):008:0* result = RubyProf.profile do
irb(main):009:1* 1x2
irb(main):010:1> end
SyntaxError: (irb):9: syntax error, unexpected tIDENTIFIER, expecting keyword_en
d
        from C:/Ruby193/bin/irb:12:in `<main>'
irb(main):011:0> printer = RubyProf::GraphPrinter.new(result)
=> #<RubyProf::GraphPrinter:0x1124310 @result=#<RubyProf::Result:0x11050c8>, @ou
tput=nil, @options={}, @thread_times={6793716=>0.01}>
irb(main):012:0>

4 个答案:

答案 0 :(得分:3)

1x2在红宝石中没有任何意义。请改用1*2

编辑:您必须多次运行代码,因为它太快而无法测量。

require 'ruby-prof'

prof1 = RubyProf.profile do
  10_000_000.times {1+1}
end

prof2 = RubyProf.profile do
  10_000_000.times {1*2}
end

RubyProf::GraphPrinter.new(prof1).print
RubyProf::GraphPrinter.new(prof2).print

无论如何,我认为最好的方法是使用Benchmark:

require 'benchmark'

Benchmark.bm do |x|
  x.report("1+1") {15_000_000.times {1+1}}
  x.report("1*2") {15_000_000.times {1*2}}
end

它给了我:

         user     system      total        real
1+1  2.386000   0.000000   2.386000 (  2.392529)
1*2  2.403000   0.000000   2.403000 (  2.413323)

乘法只是有点慢。但差异太小,无法实现任何意义。

答案 1 :(得分:1)

乘法是使用*而不是x完成的。这就是你在第二个例子中得到语法错误的原因。

答案 2 :(得分:1)

您想使用1 * 2,而不是1x2 ...

如果有任何情况,您将不会得到任何明显的区别。您将测量Ruby进行方法调用所花费的时间,因为与此相比,操作本身将花费的时间可以忽略不计。

答案 3 :(得分:1)

Ruby教授似乎只给你100秒的时间。这些操作比这更快,因此两个操作都会给你相同的结果。

require 'ruby-prof'
result = RubyProf.profile do
  1 + 1
end
printer = RubyProf::GraphPrinter.new(result)
printer.print(STDOUT)
result = RubyProf.profile do
  1 * 2
end
printer = RubyProf::GraphPrinter.new(result)
printer.print(STDOUT)

给予:

Thread ID: 70218521201980
Total Time: 0.01

  %total   %self     total      self      wait     child            calls   Name
--------------------------------------------------------------------------------
 100.00% 100.00%      0.00      0.00      0.00      0.00                1     Global#[No method]


Thread ID: 70218521201980
Total Time: 0.01

  %total   %self     total      self      wait     child            calls   Name
--------------------------------------------------------------------------------
 100.00% 100.00%      0.00      0.00      0.00      0.00                1     Global#[No method]

这是同一时间。也许使用内置时间你可以获得更好的结果。 这给出了以毫秒为单位的时间:

  start = Time.now
  1 + 1
  puts (Time.now - start) * 1000


  start = Time.now
  1 * 2
  puts (Time.now - start) * 1000

他们两者的平均值相同。即1000毫秒