-2

尝试使用 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

4 回答 4

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)

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

于 2011-12-02T16:11:32.787 回答
1

乘法是用*not with完成的x。这就是您在第二个示例中出现语法错误的原因。

于 2011-12-02T16:11:12.807 回答
1

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

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

于 2011-12-02T16:11:43.723 回答
1

Ruby prof 似乎只在 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]

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

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


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

他们俩平均起来是一样的。即千分之一毫秒

于 2011-12-02T16:30:00.223 回答