web-dev-qa-db-fra.com

Comment obtenir le temps écoulé en millisecondes en Ruby?

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.

86
Geo

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.

118
ezpz

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
56
phlipper

Je pense que la réponse est mal choisie, cette méthode donne des secondes, pas des millisecondes.

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

Ici, je suppose que la valeur flottante correspond aux millisecondes.

26
LowFieldTheory

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!

9
Carl Smotricz

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
9
Steven Yue

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:

  • mettre en variable l'heure actuelle;
  • insérez le bloc à tester;
  • mettre dans une variable l'heure actuelle, en soustrayant la valeur précédente de l'heure actuelle;

C'est un processus très simple, donc je ne suis pas sûr que vous demandiez vraiment ceci ...

6
vyger

%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.

4

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).

3
mrueg
DateTime.now.strftime("%Q")

Exemple d'utilisation:

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

>> DateTime.now.strftime("%Q").to_i
=> 1541433332357
1
Ryan McGeary

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
0
Robert