Как получить истекшее время в миллисекундах в Ruby? - PullRequest
89 голосов
/ 12 сентября 2009

Если у меня есть Time объект, полученный из:

Time.now

и позже я создаю другой объект с той же строкой, как я могу увидеть, сколько прошло миллисекунд? Второй объект может быть создан в ту же минуту, в течение следующих минут или даже часов.

Ответы [ 10 ]

121 голосов
/ 12 сентября 2009

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

Например:

def time_diff_milli(start, finish)
   (finish - start) * 1000.0
end

t1 = Time.now
# arbitrary elapsed time
t2 = Time.now

msecs = time_diff_milli t1, t2

Вам нужно будет решить, обрезать это или нет.

56 голосов
/ 21 июня 2011

Вы можете добавить немного синтаксического сахара к вышеприведенному решению с помощью следующего:

class Time
  def to_ms
    (self.to_f * 1000.0).to_i
  end
end

start_time = Time.now
sleep(3)
end_time = Time.now
elapsed_time = end_time.to_ms - start_time.to_ms  # => 3004
27 голосов
/ 23 октября 2013

Я думаю, что ответ выбран неправильно, этот метод дает секунды, а не миллисекунды.

t = Time.now.t­o_f
=> 1382471965.146

Здесь я предполагаю, что плавающее значение - это миллисекунды

10 голосов
/ 21 января 2016

Чтобы получить время в миллисекундах, лучше добавить .round(3), поэтому в некоторых случаях оно будет более точным:

puts Time.now.to_f # => 1453402722.577573

(Time.now.to_f.round(3)*1000).to_i  # => 1453402722578
9 голосов
/ 01 ноября 2009

Ответ ezpz почти идеален, но я надеюсь, что смогу добавить еще немного.

Гео спросил о времени в миллисекундах; это звучит как целое число, и я бы не пошел в обход земли с плавающей точкой. Таким образом, мой подход будет:

irb(main):038:0> t8 = Time.now
=> Sun Nov 01 15:18:04 +0100 2009
irb(main):039:0> t9 = Time.now
=> Sun Nov 01 15:18:18 +0100 2009
irb(main):040:0> dif = t9 - t8
=> 13.940166
irb(main):041:0> (1000 * dif).to_i
=> 13940

Умножение на целое число 1000 прекрасно сохраняет дробное число и также может быть немного быстрее.

Если вы имеете дело с датами и временем, вам может понадобиться класс DateTime . Это работает аналогично, но коэффициент преобразования составляет 24 *3600* 1000 = 86400000 .

Я обнаружил, что функции DateTime strptime и strftime неоценимы для анализа и форматирования строк даты / времени (например, в / из журналов). Что полезно знать, это:

  • Символы форматирования для этих функций (% H,% M,% S, ...) почти такие же, как для функций C, присутствующих в любой системе Unix / Linux; и

  • Есть еще несколько: в частности, % L делает миллисекунды!

6 голосов
/ 12 сентября 2009

Time.now.to_f может помочь вам, но возвращает секунды.

В общем, при работе с бенчмарками I:

  • подставить в переменную текущее время;
  • вставить блок для проверки;
  • положить в переменную текущее время, вычитая предыдущее значение текущего времени;

Это очень простой процесс, поэтому я не уверен, что вы действительно спрашивали об этом ...

4 голосов
/ 11 апреля 2017

%L дает миллисекунды в рубине

require 'time'
puts Time.now.strftime("%Y-%m-%dT%H:%M:%S.%L")

или

puts Time.now.strftime("%Y-%m-%d %H:%M:%S.%L")

даст вам текущую метку времени в миллисекундах.

3 голосов
/ 05 ноября 2018
DateTime.now.strftime("%Q")

Пример использования:

>> DateTime.now.strftime("%Q")
=> "1541433332357"

>> DateTime.now.strftime("%Q").to_i
=> 1541433332357
3 голосов
/ 12 сентября 2009

Попробуйте вычесть первый Time.now из второго. Вот так:

a = Time.now
sleep(3)
puts Time.now - a # about 3.0

Это дает вам число с плавающей точкой в ​​секундах между двумя временами (и вместе с этим миллисекунды).

0 голосов
/ 29 августа 2018

Ответ примерно такой:

t_start = Time.now
# time-consuming operation
t_end = Time.now

milliseconds = (t_start - t_end) * 1000.0

Однако, подход Time.now может быть неточным. Я нашел этот пост от Луки Гуиди:

https://blog.dnsimple.com/2018/03/elapsed-time-with-ruby-the-right-way/

Системные часы постоянно плавают и не двигаются только вперед. Если ваш расчет истекшего времени основан на нем, вы, скорее всего, столкнетесь с ошибками расчета или даже сбоями .

Итак, вместо этого рекомендуется использовать Process.clock_gettime. Что-то вроде:

def measure_time
  start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
  yield
  end_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
  elapsed_time = end_time - start_time
  elapsed_time.round(3)
end

Пример:

elapsed = measure_time do
    # your time-consuming task here:
    sleep 2.2321
end

=> 2.232
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...