101 votes

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

Si j'ai un Time objet obtenu à partir de :

Time.now

et que plus tard j'instancie un autre objet avec la même ligne, comment puis-je voir combien de millisecondes se sont écoulées ? Le deuxième objet peut être créé au cours de la même minute, des minutes suivantes ou même des heures.

9voto

Robert Points 357

La réponse est à peu près la suivante :

t_start = Time.now
# time-consuming operation
t_end = Time.now

milliseconds = (t_start - t_end) * 1000.0

Toutefois, le Time.now risque d'être inexacte. J'ai trouvé cet article de Luca Guidi :

https://blog.dnsimple.com/2018/03/elapsed-time-with-ruby-the-right-way/

L'horloge du système est constamment en train de flotter et ne se déplace pas uniquement vers l'avant. Si votre calcul du temps écoulé est basé sur elle, vous risquez fort de rencontrer des erreurs de calcul, voire des pannes .

Il est donc 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

9voto

Carl Smotricz Points 36400

ezpz la réponse est presque parfait, mais j'espère que je peux ajouter un peu plus.

Geo interrogé sur le temps en millisecondes; cela sonne comme un entier en quantité, et je ne voudrais pas prendre la déviation à virgule flottante terre. Donc 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

En multipliant par un nombre entier de 1000 conserve le nombre fractionnaire parfaitement et peut-être un peu plus rapide aussi.

Si vous avez affaire à des dates et des heures, vous devrez peut-être utiliser le DateTime classe. Cela fonctionne de la même manière, mais le facteur de conversion est 24 * 3600 * 1000 = 86400000 .

J'ai trouvé DateTime est strptime et strftime fonctions précieux dans l'analyse et la mise en forme de la date/heure des chaînes de caractères (par exemple pour/à partir de journaux). Ce qui est très pratique pour savoir, c'est:

  • Les caractères de formatage pour ces fonctions (%H, %M, %S, ...) sont presque les mêmes que pour les fonctions C trouvé sur n'importe quel système Unix/Linux; et

  • Il y a un peu plus: En particulier, %L ne millisecondes!

0 votes

Bon à savoir ! Merci de votre compréhension. unknown :)

1 votes

De toute façon, %L n'existe que dans Ruby 1.9 ;)

7voto

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

6voto

Temps.now.to_f peut vous aider, mais il renvoie des secondes.

En général, lorsque l'on travaille avec des points de repère, je :

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

Il s'agit d'un processus très simple, je ne suis donc pas sûr que vous posiez vraiment cette question...

3voto

mrueg Points 5323

Essayez de soustraire le premier Time.now du second. Par exemple :

a = Time.now
sleep(3)
puts Time.now - a # about 3.0

Cela vous donne un nombre flottant de secondes entre les deux temps (et avec cela, les millisecondes).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X