Использование 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
Они оба в среднем одинаковы. т.е. тысячная миллисекунды