Comment puis-je mesurer le temps pris par une méthode et les déclarations individuelles de cette méthode dans Ruby. Si vous voyez la méthode ci-dessous, je veux mesurer le temps total pris par la méthode et le temps nécessaire pour l'accès à la base de données et l'accès redis. Je ne veux pas écrire Benchmark.measure avant chaque déclaration. L'interpréteur ruby nous donne-t-il des crochets pour faire cela?
def foo
# code to access database
# code to access redis.
end
new Date()
javascript de ruby, mais je ne me souviens pas de la syntaxe correcte. devrait vous donner une liste Google décenteRéponses:
Vous pouvez utiliser l'
Time
objet. ( Time Docs )Par exemple,
start = Time.now # code to time finish = Time.now diff = finish - start
diff
serait en secondes, sous forme de nombre à virgule flottante.EDIT:
end
est réservé.la source
end
est réservé, utilisez donc un autre nom de variable.Time.now
est affectée par les ajustements de l'horloge système, c'est donc une meilleure pratique à utiliser à laProcess.clock_gettime(Process::CLOCK_MONOTONIC)
place. Mais pour les calculs approximatifs, cela n'a pas d'importance. blog.dnsimple.com/2018/03/elapsed-time-with-ruby-the-right-wayLe moyen le plus simple:
require 'benchmark' def foo time = Benchmark.measure { code to test } puts time.real #or save it to logs end
Exemple de sortie:
2.2.3 :001 > foo 5.230000 0.020000 5.250000 ( 5.274806)
Les valeurs sont: temps cpu, temps système, temps total et réel écoulé.
Source: ruby docs .
la source
Benchmark.realtime { block }
si vous voulez juste le temps réelUtiliser
Benchmark
le rapportrequire 'benchmark' # Might be necessary. def foo Benchmark.bm( 20 ) do |bm| # The 20 is the width of the first column in the output. bm.report( "Access Database:" ) do # Code to access database. end bm.report( "Access Redis:" ) do # Code to access redis. end end end
Cela affichera quelque chose comme ce qui suit:
user system total real Access Database: 0.020000 0.000000 0.020000 ( 0.475375) Access Redis: 0.000000 0.000000 0.000000 ( 0.000037) <------ 20 -------> # This is where the 20 comes in. NOTE: This is not shown in output.
Plus d'informations peuvent être trouvées ici .
la source
Benchmark
classe utilise une horloge monotone, comme indiqué dans d'autres réponses. Voir par exemple le code source suivant, et recherchez "def measure" sur la ligne 286: github.com/ruby/ruby/blob/ruby_2_2/lib/benchmark.rbBeaucoup de réponses suggèrent l'utilisation de
Time.now
. Mais il vaut la peine d'être conscient que celaTime.now
peut changer. Les horloges système peuvent dériver et être corrigées par l'administrateur système ou via NTP. Il est donc possible pour Time.now de sauter en avant ou en arrière et de donner à votre benchmarking des résultats inexacts.Une meilleure solution consiste à utiliser l'horloge monotone du système d'exploitation, qui avance toujours. Ruby 2.1 et supérieur donnent accès à cela via:
start = Process.clock_gettime(Process::CLOCK_MONOTONIC) # code to time finish = Process.clock_gettime(Process::CLOCK_MONOTONIC) diff = finish - start # gets time is seconds as a float
Vous pouvez lire plus de détails ici . Vous pouvez également voir le projet Ruby populaire, Sidekiq, qui est passé à l' horloge monotone .
la source
Une seconde réflexion, définir la fonction measure () avec l'argument de bloc de code Ruby peut aider à simplifier le code de mesure du temps:
def measure(&block) start = Time.now block.call Time.now - start end # t1 and t2 is the executing time for the code blocks. t1 = measure { sleep(1) } t2 = measure do sleep(2) end
la source
benchmark
. Lorsque vous l'utilisez, il est appelémeasure
. Veuillez corriger cela.Dans l'esprit de la réponse de wquist , mais un peu plus simple, vous pouvez également le faire comme ci-dessous:
start = Time.now # code to time Time.now - start
la source
Regardez dans l'
ruby-prof
emballage, il devrait avoir ce dont vous avez besoin. Cela créera d'énormes piles d'appels avec des horaires.http://ruby-prof.rubyforge.org/
Cela peut être trop granulaire, auquel cas le simple fait d'envelopper des sections plus grandes
Benchmark.measure
pourrait être une bonne solution.la source
Une autre méthode pour comparer automatiquement le code dans la console rails utilise ce joyau: https://github.com/igorkasyanchuk/execution_time
vous verrez des informations similaires à celles des demandes dans les journaux
la source