Jeśli mam Time
przedmiot otrzymany od:
Time.now
a później tworzę instancję innego obiektu z tą samą linią, jak mogę sprawdzić, ile milisekund minęło? Drugi obiekt może powstać w tej samej minucie, w ciągu następnych minut lub nawet godzin.
Jak już wspomniano, możesz operować na Time
obiektach 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 - start
daje zmiennoprzecinkowe;.to_f
byłoby zbędne.(t2 - t1).in_milliseconds
Możesz dodać trochę cukru składniowego do powyższego rozwiązania, wykonując następujące czynności:
źródło
Myślę, że odpowiedź jest źle wybrana, ta metoda daje sekundy, a nie milisekundy.
Przypuszczam, że wartość zmienna to milisekundy
źródło
Time.now
oznacza 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 przez1000.0
milisekundy.Aby uzyskać czas w milisekundach, lepiej dodać
.round(3)
, więc w niektórych przypadkach będzie dokładniejszy:źródło
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:
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!
źródło
unknown
:)Przykładowe użycie:
źródło
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ś ...
źródło
%L
daje milisekundy w rubinielub
poda aktualny znacznik czasu w milisekundach.
źródło
Odpowiedź brzmi mniej więcej tak:
Jednak takie
Time.now
podejś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/
Dlatego zaleca się użycie
Process.clock_gettime
zamiast tego. Coś jak:Przykład:
źródło
Spróbuj odjąć pierwszy Time.now od drugiego. Tak jak to:
To daje zmiennoprzecinkową liczbę sekund między tymi dwoma czasami (a wraz z tym milisekundami).
źródło