Если у меня есть Time
объект, полученный от:
Time.now
а позже я создаю другой объект с той же строкой, как я могу узнать, сколько миллисекунд прошло? Второй объект может быть создан в ту же минуту, в течение следующих минут или даже часов.
Ответы:
Как уже говорилось, вы можете работать с 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
Вам нужно будет решить, обрезать это или нет.
finish.to_f - start.to_f
?
finish - start
дает плавающую точку; .to_f
будет лишним.
(t2 - t1).in_milliseconds
Думаю, ответ выбран неправильно, этот метод дает секунды, а не миллисекунды.
t = Time.now.to_f
=> 1382471965.146
Здесь я предполагаю, что плавающее значение - это миллисекунды.
Time.now
означает обработку времени как значений с плавающей запятой с секундами до десятичной точки и до наносекунд после десятичной точки (хотя нсек может быть не совсем точным). Таким образом, умножение этого значения на 1000.0
дает миллисекунды.
Ответ 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 обрабатывает миллисекунды!
unknown
:)
%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")
даст вам текущую временную метку в миллисекундах.
DateTime.now.strftime("%Q")
Пример использования:
>> DateTime.now.strftime("%Q")
=> "1541433332357"
>> DateTime.now.strftime("%Q").to_i
=> 1541433332357
Time.now.to_f может вам помочь, но возвращает секунды.
В общем, при работе с тестами я:
Это очень простой процесс, поэтому я не уверен, что вы действительно об этом спрашивали ...
Ответ примерно такой:
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