Odpowiedzi:
Jak już wspomniano, możesz operować na Timeobiektach tak, jakby były wartościami numerycznymi (lub zmiennoprzecinkowymi). Te operacje dają drugą rozdzielczość, którą można łatwo przekonwertować.
Na przykład:
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
Będziesz musiał zdecydować, czy to skrócić, czy nie.
finish.to_f - start.to_f?
finish - startdaje zmiennoprzecinkowe; .to_fbyłoby zbędne.
(t2 - t1).in_milliseconds
Myślę, że odpowiedź jest źle wybrana, ta metoda daje sekundy, a nie milisekundy.
t = Time.now.to_f
=> 1382471965.146
Przypuszczam, że wartość zmienna to milisekundy
Time.nowoznacza traktowanie czasu jako wartości zmiennoprzecinkowych z sekundami przed przecinkiem i do nanosekund po przecinku (chociaż nsec może nie być całkowicie dokładne). Więc pomnożenie tej wartości przez 1000.0milisekundy.
Aby uzyskać czas w milisekundach, lepiej dodać .round(3), więc w niektórych przypadkach będzie dokładniejszy:
puts Time.now.to_f # => 1453402722.577573
(Time.now.to_f.round(3)*1000).to_i # => 1453402722578
Odpowiedź ezpz jest prawie idealna, ale mam nadzieję, że mogę dodać trochę więcej.
Geo zapytał o czas w milisekundach; brzmi to jak liczba całkowita i nie wybrałbym objazdu przez ziemię zmiennoprzecinkową. Zatem moje podejście byłoby następujące:
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
Mnożenie przez liczbę całkowitą 1000 doskonale zachowuje liczbę ułamkową i może być również trochę szybsze.
Jeśli masz do czynienia z datami i godzinami, może być konieczne użycie klasy DateTime . Działa to podobnie, ale współczynnik konwersji wynosi 24 * 3600 * 1000 = 86400000 .
Zauważyłem, że funkcje strptime i strftime DateTime są nieocenione w analizowaniu i formatowaniu ciągów daty / czasu (np. Do / z dzienników). Warto wiedzieć:
Znaki formatujące dla tych funkcji (% H,% M,% S, ...) są prawie takie same jak dla funkcji C znajdujących się w każdym systemie Unix / Linux; i
Jest jeszcze kilka: w szczególności % L robi milisekundy!
unknown:)
DateTime.now.strftime("%Q")
Przykładowe użycie:
>> DateTime.now.strftime("%Q")
=> "1541433332357"
>> DateTime.now.strftime("%Q").to_i
=> 1541433332357
Time.now.to_f może ci pomóc, ale zwraca sekundy.
Generalnie podczas pracy z benchmarkami I:
To bardzo prosty proces, więc nie jestem pewien, czy naprawdę o to pytałeś ...
%L daje milisekundy w rubinie
require 'time'
puts Time.now.strftime("%Y-%m-%dT%H:%M:%S.%L")
lub
puts Time.now.strftime("%Y-%m-%d %H:%M:%S.%L")
poda aktualny znacznik czasu w milisekundach.
Odpowiedź brzmi mniej więcej tak:
t_start = Time.now
# time-consuming operation
t_end = Time.now
milliseconds = (t_start - t_end) * 1000.0
Jednak takie Time.nowpodejście może być niedokładne. Znalazłem ten post Luca Guidi:
https://blog.dnsimple.com/2018/03/elapsed-time-with-ruby-the-right-way/
zegar systemowy nieustannie płynie i nie przesuwa się tylko do przodu. Jeśli opiera się na niej obliczanie czasu, który upłynął, jest bardzo prawdopodobne, że wystąpią błędy obliczeniowe lub nawet przestoje .
Dlatego zaleca się użycie Process.clock_gettimezamiast tego. Coś jak:
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
Przykład:
elapsed = measure_time do
# your time-consuming task here:
sleep 2.2321
end
=> 2.232