Узнайте, как протестировать (т. е. измерить производительность) код Ruby, из этой небольшой статьи.
Что такое бенчмаркинг?
Бенчмаркинг — это мера производительности фрагмента кода. Лично мне эта тема кажется несколько спорной. поскольку что-то более читабельное, но работает не так хорошо, как менее производительный фрагмент кода.
Но поэкспериментировав с некоторыми методами Ruby, вот три способа, с помощью которых я попытался проверить, работает ли один способ решения проблемы лучше, чем другой.
Давайте попробуем Ruby-способ…
Сегодня я собираюсь попробовать цикл while в Ruby. Существует несколько доступных синтаксисов, поэтому я попробую 2 из них.
В основном это будет статья, основанная на примерах. Погуглив, я нашел 3 способа протестировать цикл while. Пойдем.
Во-первых, Benchmark.realtime
require 'benchmark'
time = Benchmark.realtime do
x = 1
loop do
x += 1
break if x > 100
end
end
puts "loop took #{time} seconds."
time = Benchmark.realtime do
x = 1
while true
x += 1
break if x > 100
end
end
puts "while took #{time} seconds."
Результат:
loop took 8.14200029708445e-06 seconds.
while took 1.203499959956389e-05 seconds.
Хорошо, отчет не очень читаемый, но кажется, что цикл работает лучше.
Во-вторых, Benchmark.bm.
require 'benchmark'
Benchmark.bm do |benchmark|
benchmark.report("loop.") do
x = 1
loop do
x += 1
break if x > 100
end
end
benchmark.report("while") do
x = 1
while true
x += 1
break if x > 100
end
end
end
Дает следующие результаты:
user system total real
loop. 0.000020 0.000006 0.000026 ( 0.000022)
while 0.000003 0.000001 0.000004 ( 0.000003)
В столбце «реальный» указано общее затраченное время.
Ура! Кажется, что теперь, когда while
версия работает лучше.
Попробуем еще раз тем же методом.
user system total real
loop. 0.000014 0.000002 0.000016 ( 0.000011)
while 0.000004 0.000000 0.000004 ( 0.000004)
Ок, похоже, что 2 последовательных запуска дают совсем другой результат. По крайней мере, на этот раз тот же метод работает лучше.
В-третьих, Benchmark.measure
require 'benchmark'
puts Benchmark.measure {
50_000.times do
x = 1
loop do
x += 1
break if x > 100
end
end
}
puts Benchmark.measure {
50_000.times do
x = 1
while true
x += 1
break if x > 100
end
end
}
Это дает следующие результаты:
0.261000 0.003973 0.264973 ( 0.266082)
0.083610 0.000001 0.083611 ( 0.083994)
Первая строка — это результат .loop
метод, а второй о .while
метод.
Результатом в скобках является агрегат (полное время для вычисления операции).
.while
вроде здесь лучше.
Краткое содержание
Мы рассмотрели три способа измерения производительности метода Ruby, однако трудно сделать какой-либо вывод, поскольку здесь у меня были разные результаты. Мне нужно провести расследование, чтобы быть уверенным в том, что происходит.
2024-03-14 08:39:30
1710409216
#Как #протестировать #код #Ruby