Использование ruby-prof для получения разницы во времени выполнения между "1+1" и "1x2"

Попытка профилировать разницу во времени выполнения между "1+1" и "1x2", используя Ruby и гем ruby-prof.

Установите 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 ответа

Решение

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 * 2не 1x2...

Если в любом случае, вы не получите никакой заметной разницы. Вы будете измерять время, необходимое Ruby для выполнения вызова метода, поскольку сама операция по сравнению с этим займет незначительное время.

Умножение сделано с * не с x, Вот почему вы получаете синтаксическую ошибку на вашем втором примере.

Ruby prof только дает вам время в сотых секундах. Эти операции выполняются быстрее, и поэтому обе операции дадут вам одинаковый результат.

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

Они оба в среднем одинаковы. т.е. тысячная миллисекунды

Другие вопросы по тегам