Использование ruby-prof для получения разницы во времени выполнения между "1 + 1" и "1x2" - PullRequest
0 голосов
/ 02 декабря 2011

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

Установите гем и соберите вместе некоторый код, который работает, но работаетне дайте мне ответ, который я ищу, это разница во времени выполнения.

Возможно ли это, и если да, то какой код даст мне этот ответ?


Этокод, кажется, работает, но не позволяет мне увидеть разницу во времени выполнения.


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 ]

3 голосов
/ 02 декабря 2011

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 голос
/ 02 декабря 2011

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

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

1 голос
/ 02 декабря 2011

Вы хотите использовать 1 * 2, а не 1x2 ...

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

1 голос
/ 02 декабря 2011

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

...