Wie kann ich die Zeit messen, die eine Methode benötigt, und die einzelnen Anweisungen in dieser Methode in Ruby. Wenn Sie die folgende Methode sehen, möchte ich die Gesamtzeit messen, die die Methode benötigt, und die Zeit, die für den Datenbankzugriff und den Redis-Zugriff benötigt wird. Ich möchte Benchmark.measure nicht vor jeder Aussage schreiben. Gibt uns der Ruby-Interpreter irgendwelche Haken dafür?
def foo
# code to access database
# code to access redis.
end
new Date()
von Javascript, das Ruby hat, aber ich kann mich nicht an die richtige Syntax erinnern. sollte Ihnen eine anständige Google-Auflistung gebenAntworten:
Sie könnten das
Time
Objekt verwenden. ( Zeitdokumente )Beispielsweise,
diff
wäre in Sekunden als Gleitkommazahl.BEARBEITEN:
end
ist reserviert.quelle
end
ist reserviert, verwenden Sie also einen anderen Variablennamen.Time.now
wird durch Anpassungen der Systemuhr beeinflusst, daher ist es eine bewährte Methode, dieseProcess.clock_gettime(Process::CLOCK_MONOTONIC)
stattdessen zu verwenden . Für grobe Berechnungen spielt dies jedoch keine Rolle. blog.dnsimple.com/2018/03/elapsed-time-with-ruby-the-right-wayDer einfachste Weg:
Beispielausgabe:
Die Werte sind: CPU-Zeit, Systemzeit, Gesamt- und tatsächlich verstrichene Zeit.
Quelle: Ruby Docs .
quelle
Benchmark.realtime { block }
wenn Sie nur die Echtzeit wollenVerwenden Sie
Benchmark
den BerichtDies gibt ungefähr Folgendes aus:
Weitere Informationen finden Sie hier .
quelle
Benchmark
Klasse ab Ruby 2.2 eine monotone Uhr verwendet, wie in anderen Antworten erläutert. Sehen Sie sich zum Beispiel den folgenden Quellcode an und suchen Sie in Zeile 286 nach "def Measure": github.com/ruby/ruby/blob/ruby_2_2/lib/benchmark.rbViele der Antworten deuten auf die Verwendung von hin
Time.now
. Es lohnt sich jedoch zu wissen, dassTime.now
sich dies ändern kann. Systemuhren können driften und werden möglicherweise vom Systemadministrator oder über NTP korrigiert. Time.now kann daher vorwärts oder rückwärts springen und Ihrem Benchmarking ungenaue Ergebnisse liefern.Eine bessere Lösung ist die Verwendung der monotonen Uhr des Betriebssystems, die sich immer vorwärts bewegt. Ruby 2.1 und höher bieten Zugriff darauf über:
Weitere Details können Sie hier lesen . Sie können auch sehen, dass das beliebte Ruby-Projekt Sidekiq auf monotone Uhr umgestellt hat .
quelle
Ein zweiter Gedanke: Definieren Sie die Funktion Measure () mit dem Ruby-Code-Blockargument, um den Zeitmesscode zu vereinfachen:
quelle
benchmark
. Wenn Sie es verwenden, wird es aufgerufenmeasure
. Bitte beheben Sie dies.Im Geiste der Antwort von wquist , aber etwas einfacher, können Sie dies auch wie folgt tun:
quelle
Schauen Sie in das
ruby-prof
Paket, es sollte haben, was Sie brauchen. Es werden riesige Anrufstapel mit Timings erstellt.http://ruby-prof.rubyforge.org/
Es könnte zu körnig sein. In diesem Fall ist es
Benchmark.measure
möglicherweise ein guter Weg, größere Abschnitte einzuwickeln.quelle
Eine andere Methode zum automatischen Benchmarking von Code in der Rails-Konsole ist die Verwendung dieses Edelsteins: https://github.com/igorkasyanchuk/execution_time
Sie sehen ähnliche Informationen wie bei Anfragen in Protokollen
quelle