Si j'ai un objet Time
obtenu à partir de:
Time.now
et plus tard j'instancie un autre objet avec cette même ligne, comment puis-je voir combien de millisecondes ont passé? Le deuxième objet peut être créé à la même minute, au cours des prochaines minutes, voire des heures.
Comme indiqué précédemment, vous pouvez utiliser des objets Time
comme s'il s'agissait de valeurs numériques (ou à virgule flottante). Ces opérations entraînent une seconde résolution qui peut facilement être convertie.
Par exemple:
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
Vous devrez décider de tronquer cela ou non.
Vous pouvez ajouter un petit sucre de syntaxe à la solution ci-dessus avec les éléments suivants:
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
Je pense que la réponse est mal choisie, cette méthode donne des secondes, pas des millisecondes.
t = Time.now.to_f
=> 1382471965.146
Ici, je suppose que la valeur flottante correspond aux millisecondes.
la réponse de ezpz est presque parfaite, mais j'espère pouvoir en ajouter un peu plus.
Geo a demandé à propos du temps en millisecondes; cela ressemble à un nombre entier, et je ne ferais pas le détour par des terres en virgule flottante. Ainsi, mon approche serait:
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
Multiplier par un entier 1000 préserve parfaitement le nombre fractionnaire et peut être un peu plus rapide aussi.
Si vous traitez avec des dates et des heures, vous devrez peut-être utiliser la classe DateTime . Cela fonctionne de manière similaire mais le facteur de conversion est 24 * 3600 * 1000 = 86400000 .
J'ai trouvé les fonctions strptime et strftime de DateTime indispensables à l'analyse et au formatage des chaînes de date/heure (par exemple, vers/depuis les journaux). Ce qui est pratique à savoir est:
Les caractères de formatage de ces fonctions (% H,% M,% S, ...) sont presque les mêmes que pour les fonctions C présentes sur tous les systèmes Unix/Linux; et
Il y en a quelques autres: en particulier,% L ne fait que quelques millisecondes!
Pour obtenir du temps en millisecondes, il vaut mieux ajouter .round(3)
. Ce sera donc plus précis dans certains cas:
puts Time.now.to_f # => 1453402722.577573
(Time.now.to_f.round(3)*1000).to_i # => 1453402722578
Time.now.to_f peut vous aider, mais renvoie des secondes.
En général, lorsque je travaille avec des points de repère, je:
C'est un processus très simple, donc je ne suis pas sûr que vous demandiez vraiment ceci ...
%L
donne des millisecondes en Ruby
require 'time'
puts Time.now.strftime("%Y-%m-%dT%H:%M:%S.%L")
ou
puts Time.now.strftime("%Y-%m-%d %H:%M:%S.%L")
vous donnera l'heure actuelle en millisecondes.
Essayez de soustraire le premier Time.now du second. Ainsi:
a = Time.now
sleep(3)
puts Time.now - a # about 3.0
Cela vous donne un nombre à virgule flottante des secondes entre les deux fois (et avec cela, les millisecondes).
DateTime.now.strftime("%Q")
Exemple d'utilisation:
>> DateTime.now.strftime("%Q")
=> "1541433332357"
>> DateTime.now.strftime("%Q").to_i
=> 1541433332357
La réponse est quelque chose comme:
t_start = Time.now
# time-consuming operation
t_end = Time.now
milliseconds = (t_start - t_end) * 1000.0
Cependant, l'approche Time.now
risque d'être inexacte. J'ai trouvé ce post de Luca Guidi:
https://blog.dnsimple.com/2018/03/elapsed-time-with-Ruby-the-right-way/
l'horloge système flotte constamment et ne fait pas que avancer. Si votre calcul du temps écoulé est basé sur celui-ci, vous risquez fort de rencontrer des erreurs de calcul, voire des pannes .
Donc, il est recommandé d'utiliser Process.clock_gettime
à la place. Quelque chose comme:
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
Exemple:
elapsed = measure_time do
# your time-consuming task here:
sleep 2.2321
end
=> 2.232