Wie Profil Methoden in Scala?
Was ist ein standard Art von profiling-Scala-Methode Aufrufe?
Was ich brauche sind die Haken um eine Methode, über die ich verwenden können, um die start-und Stopp-Timer.
In Java ich benutze Aspekt der Programmierung, aspectJ, definieren die Methoden profiliert werden und injizieren bytecode, um das gleiche zu erreichen.
Ist es eine Natürliche Art und Weise in Scala, wo kann ich definieren, eine Reihe von Funktionen aufgerufen werden, bevor und nachdem eine Funktion ohne statische Typisierung in den Prozess ein?
- Wenn AspectJ spielt schön mit Scala, verwenden AspectJ. Warum das Rad neu erfinden? Die Antworten über die Verwendung von benutzerdefinierten flow control erfüllen die grundlegenden Anforderungen des AOP-da, Sie zu verwenden, müssen Sie den code so ändern. Diese könnten auch von Interesse sein: java.dzone.com/articles/real-world-scala-managing-cros blog.fakod.eu/2010/07/26/cross-cutting-concerns-in-scala
- - chariotsolutions.com/blog/post/microbenchmarking-scala-with-jmh - github.com/wadejensen/sbt-jmh-example - github.com/ktoso/sbt-jmh
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wollen Sie tun dies ohne Veränderung der code, den Sie Messen möchten Taktungen? Wenn Sie nichts dagegen haben, ändern Sie den code, dann könnte man etwas wie das hier tun:
t1
innerhalb einerfinally
- Klauseldef time[R](label: String)(block: => R): R = {
dann fügen Sie die Beschriftung auf dieprintln
Neben Jesper Antwort, können Sie automatisch wrap-Methodenaufrufe, die in der REPL:
Nun - wir wickeln alles, was in dieser
OK - müssen wir uns im power-Modus
Wrap entfernt
Ich habe keine Ahnung, warum das gedruckte Zeug 5 mal
Update der 2.12.2:
:wrap
Funktion wurde entfernt und aus der REPL :-\$intp.setExecutionWrapper
.Gibt es drei benchmarking-Bibliotheken für Scala, dass Sie nutzen zu können.
Da die URLs auf der verlinkten Seite sind wahrscheinlich ändern, ich bin das einfügen der relevanten Inhalte unter.
SPerformance - Performance-Testing-framework richtet sich an automagisch Vergleich der performance-tests und die arbeiten im inneren Simple Build Tool.
scala-benchmarking-Vorlage - SBT template-Projekt zum erstellen von Scala (micro-)benchmarks, basierend auf den Bremssattel.
Metriken - Erfassung von JVM - und application-level-Metriken. Damit Sie wissen, was Los ist
Das, was ich verwenden:
testing.Benchmark
nützlich sein könnten.Nahm ich die Lösung von Jesper und fügte einige aggregation, um es auf mehrfache Ausführung des gleichen Codes
Angenommen, Sie möchten die Zeit, die zwei Funktionen
counter_new
undcounter_old
ist der Anschluss an die Nutzung:Ich hoffe, dies ist hilfreich
Verwende ich eine Technik, die leicht zu bewegen in code-Blöcken. Die crux ist, dass die gleichen Zeile beginnt und endet der timer - so ist es wirklich ein einfaches kopieren und einfügen. Die andere nette Sache ist, dass Sie definieren, was das timing für Sie bedeutet als eine Zeichenfolge, die alle in derselben Zeile.
Beispiel:
Code:
Vorteile:
Nachteile:
z.B. wenn Ihr code nicht erhalten, um den zweiten Aufruf für einen bestimmten timer starten.
Timelog.timer("timer name/description")
?Ich mag die Einfachheit von @wrick die Antwort, wollte aber auch:
profiler Griffe Schleife (für die Konsistenz und Komfort)
genauere timing (mit nanoTime)
Zeit pro iteration (nicht die Gesamtzeit aller Iterationen)
nur Rückgabe ns/iteration - nicht ein Tupel
Dies ist hier erreicht:
Für noch mehr Genauigkeit, eine einfache Modifikation ermöglicht eine JVM Hotspot-warmup-Schleife (nicht zeitlich) timing-kleine snippets:
ScalaMeter ist eine schöne Bibliothek zu benchmarking in Scala
Unten ist ein einfaches Beispiel
Führt man obigen code-Schnipsel in Scala Arbeitsblatt bekommen Sie die Laufzeit in Millisekunden
Beim stehen auf den Schultern von Riesen...
Einen soliden 3rd-party-Bibliothek wäre ideal, aber wenn Sie etwas brauchen schnell und std-Bibliothek basiert, folgende Variante bietet:
.
Zudem erwähnenswert ist, die Sie verwenden können, die
Duration.toCoarsest
Methode, um zu konvertieren, um die größte Zeiteinheit möglich, obwohl ich nicht sicher bin, wie freundlich dieser ist mit kleinen Zeit-Unterschied zwischen läuft z.B.Können Sie
System.currentTimeMillis
:Verwendung:
nanoTime zeigen Ihnen
ns
, so wird es schwer zu sehen. Daher schlage ich vor, Sie verwenden können currentTimeMillis statt.