Как рассчитать время операции в рублях в миллисекундах?

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

Как ты это делаешь? В большинстве языков программирования это просто что-то вроде

start = now.milliseconds
myfunction()
end = now.milliseconds
time = end - start
70 голосов | спросил Earlz 18 FebruaryEurope/MoscowbThu, 18 Feb 2010 17:42:06 +0300000000pmThu, 18 Feb 2010 17:42:06 +030010 2010, 17:42:06

9 ответов


0

Вы можете использовать класс ruby ​​Time. Например:

t1 = Time.now
# processing...
t2 = Time.now
delta = t2 - t1 # in seconds

Теперь delta является float объект, и вы можете получить такой же результат, как и класс.

ответил ezpz 18 FebruaryEurope/MoscowbThu, 18 Feb 2010 18:06:52 +0300000000pmThu, 18 Feb 2010 18:06:52 +030010 2010, 18:06:52
0

Вы также можете использовать встроенную функцию Benchmark.measure:

require "benchmark"
puts(Benchmark.measure { sleep 0.5 })

Печать

0.000000   0.000000   0.000000 (  0.501134)
ответил Simon Perepelitsa 4 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 04 Sep 2012 21:08:45 +0400 2012, 21:08:45
0

Использование Time.now (которое возвращает время настенных часов) в качестве базовых линий имеет несколько проблем, которые могут привести к неожиданному поведению , Это вызвано тем фактом, что время настенного часа подвержено изменениям, таким как добавленные високосные секунды или время перехода для настройки местного времени на эталонное время.

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

Решением этой проблемы является использование другого времени: монотонных часов. Этот тип часов обладает другими свойствами, чем настенные часы. Монитонически увеличивается, то есть никогда не возвращается назад и увеличивается с постоянной скоростью. При этом он не представляет настенные часы (то есть время, которое вы читаете из часов на вашей стене), но отметку времени, которую вы можете сравнить с более поздней отметкой времени, чтобы получить разницу.

В Ruby вы можете использовать такую ​​временную метку с Process.clock_gettime(Process::CLOCK_MONOTONIC) следующим образом:

t1 = Process.clock_gettime(Process::CLOCK_MONOTONIC)
# => 63988.576809828

sleep 1.5 # do some work

t2 = Process.clock_gettime(Process::CLOCK_MONOTONIC)
# => 63990.08359163

delta = t2 - t1
# => 1.5067818019961123
delta_in_milliseconds = delta * 1000
# => 1506.7818019961123

Process.clock_gettime возвращает метку времени с плавающей запятой с долями секунды. Фактическое возвращаемое число не имеет определенного значения (на которое вы должны полагаться). Однако вы можете быть уверены, что следующий вызов вернет большее число, и, сравнив значения, вы получите разницу в реальном времени.

Эти атрибуты делают метод главным кандидатом для измерения разницы во времени, не видя сбоя вашей программы в самое неподходящее время (например, в полночь в канун Нового года, когда вставляется еще одна секунда).

Используемая здесь константа Process::CLOCK_MONOTONIC доступна во всех современных системах Linux, BSD и macOS, а также в подсистеме Linux для Windows. Он (насколько мне известно) пока недоступен для «сырых» систем Windows. Там вы можете использовать GetTickCount системный вызов вместо Process.clock_gettime, который также возвращает значение таймера с точностью до миллисекунды в Windows.

ответил Holger Just 3 PM00000020000004531 2017, 14:41:45
0

Вам следует взглянуть на модуль тестов, чтобы выполнить тесты. Тем не менее, в качестве быстрого и грязного метода синхронизации вы можете использовать что-то вроде этого:

def time
  now = Time.now.to_f
  yield
  endd = Time.now.to_f
  endd - now
end

Обратите внимание на использование Time.now.to_f, которое в отличие от to_i не будет усекаться до секунд.

ответил sepp2k 18 FebruaryEurope/MoscowbThu, 18 Feb 2010 17:50:07 +0300000000pmThu, 18 Feb 2010 17:50:07 +030010 2010, 17:50:07
0

Используйте Time.now.to_f

ответил sutch 18 FebruaryEurope/MoscowbThu, 18 Feb 2010 17:48:32 +0300000000pmThu, 18 Feb 2010 17:48:32 +030010 2010, 17:48:32
0

Драгоценный камень absolute_time является заменой Benchmark, но использует собственные инструкции для большей точности.

ответил Barry 8 AMpMon, 08 Apr 2013 08:08:23 +040008Monday 2013, 08:08:23
0

Если вы используете

date = Time.now.to_i

Вы получаете время в секундах, что далеко не точно, особенно если вы рассчитываете небольшие фрагменты кода.

ответил user3401815 10 MarpmMon, 10 Mar 2014 16:52:25 +04002014-03-10T16:52:25+04:0004 2014, 16:52:25
0

Использование Time.now.to_i возвращает секунду, переданную с 1970/01/01. Зная это, вы можете сделать

date1 = Time.now.to_f
date2 = Time.now.to_f
diff = date2 - date1

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

diff = diff * 1000
ответил MARC.RS 21 FebruaryEurope/MoscowbFri, 21 Feb 2014 16:43:14 +0400000000pmFri, 21 Feb 2014 16:43:14 +040014 2014, 16:43:14
0

У меня есть гем, который может профилировать ваш метод ruby ​​(экземпляр или класс) - https://github.com /igorkasyanchuk /benchmark_methods .

Больше такого кода нет:

t = Time.now
user.calculate_report
puts Time.now - t

Теперь вы можете сделать:

benchmark :calculate_report # in class

И просто вызовите свой метод

user.calculate_report
ответил Igor Kasyanchuk 13 +03002015-10-13T09:26:13+03:00312015bEurope/MoscowTue, 13 Oct 2015 09:26:13 +0300 2015, 09:26:13

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132