Как я могу измерить время, затрачиваемое методом и отдельными операторами этого метода в Ruby. Если вы видите метод ниже, я хочу измерить общее время, затрачиваемое на этот метод, и время, затраченное на доступ к базе данных и доступ к Redis. Я не хочу писать Benchmark.measure перед каждым утверждением. Есть ли у интерпретатора ruby какие-нибудь ловушки для этого?
def foo
# code to access database
# code to access redis.
end
new Date()
javascript, которое есть в ruby, но я не могу вспомнить правильный синтаксис. должен дать вам достойный листинг в GoogleОтветы:
Вы могли бы использовать
Time
объект. ( Документы времени )Например,
start = Time.now # code to time finish = Time.now diff = finish - start
diff
будет в секундах, как число с плавающей запятой.РЕДАКТИРОВАТЬ:
end
зарезервировано.источник
end
зарезервировано, поэтому используйте другое имя переменной.Time.now
зависит от настроек системных часов, поэтому рекомендуется использовать ихProcess.clock_gettime(Process::CLOCK_MONOTONIC)
вместо них. Но для грубых расчетов это не имеет значения. blog.dnsimple.com/2018/03/elapsed-time-with-ruby-the-right-wayСамый простой способ:
require 'benchmark' def foo time = Benchmark.measure { code to test } puts time.real #or save it to logs end
Пример вывода:
2.2.3 :001 > foo 5.230000 0.020000 5.250000 ( 5.274806)
Значения: время процессора, системное время, общее и реальное прошедшее время.
Источник: ruby docs .
источник
Benchmark.realtime { block }
если хотите только в реальном времениИспользовать
Benchmark
отчетrequire 'benchmark' # Might be necessary. def foo Benchmark.bm( 20 ) do |bm| # The 20 is the width of the first column in the output. bm.report( "Access Database:" ) do # Code to access database. end bm.report( "Access Redis:" ) do # Code to access redis. end end end
Это выведет что-то вроде следующего:
user system total real Access Database: 0.020000 0.000000 0.020000 ( 0.475375) Access Redis: 0.000000 0.000000 0.000000 ( 0.000037) <------ 20 -------> # This is where the 20 comes in. NOTE: This is not shown in output.
Более подробную информацию можно найти здесь .
источник
Benchmark
класс использует монотонные часы, как обсуждалось в других ответах. См., Например, следующий исходный код и найдите «def measure» в строке 286: github.com/ruby/ruby/blob/ruby_2_2/lib/benchmark.rbМногие ответы предполагают использование
Time.now
. Но стоит знать, чтоTime.now
может измениться. Системные часы могут дрейфовать и корректироваться системным администратором или через NTP. Таким образом, Time.now может перескочить вперед или назад и дать вам неточные результаты тестирования.Лучшее решение - использовать монотонные часы операционной системы, которые всегда движутся вперед. Ruby 2.1 и выше предоставляют доступ к этому через:
start = Process.clock_gettime(Process::CLOCK_MONOTONIC) # code to time finish = Process.clock_gettime(Process::CLOCK_MONOTONIC) diff = finish - start # gets time is seconds as a float
Вы можете прочитать больше здесь . Также вы можете увидеть, как популярный проект Ruby, Sidekiq, перешел на монотонные часы .
источник
Вторая мысль: определение функции measure () с аргументом блока кода Ruby может помочь упростить код измерения времени:
def measure(&block) start = Time.now block.call Time.now - start end # t1 and t2 is the executing time for the code blocks. t1 = measure { sleep(1) } t2 = measure do sleep(2) end
источник
benchmark
. Когда вы его используете, это называетсяmeasure
. Пожалуйста, исправьте это.В духе ответа wquist , но немного проще, вы также можете сделать это, как показано ниже:
start = Time.now # code to time Time.now - start
источник
Загляните в
ruby-prof
упаковку, там должно быть то, что вам нужно. Это создаст огромные стеки вызовов с указанием времени.http://ruby-prof.rubyforge.org/
Он может быть слишком подробным, и в этом случае просто обертывание больших разделов
Benchmark.measure
может быть хорошим способом.источник
Другой метод автоматической проверки кода в консоли rails - использование этого драгоценного камня: https://github.com/igorkasyanchuk/execution_time
вы увидите информацию, аналогичную той, что вы получаете из запросов в журналах
источник