Früher oder später in einem Java Programm möchte man gerne wissen, wielange gewisse Aktivitäten dauern oder wie performant eine Code-Passage ist. Genau dann wird es Zeit im Code Aufrufe von System.currentTimeMillis() einzubauen oder besser — wenn man objektorientiert denkt — eine eigene StopWatch Hilfsklasse zu implementieren, deren Verantwortlichkeit darin liegt, Zeitmessungen komfortabel bewerkstelligen zu können.
Da stellt sich natürlich die Frage, ob es nicht vielleicht irgendwo in der großen, weiten Java Welt da draußen schon fertige Implementierungen dieser nicht sonderbaren Anforderungen gibt. Ich möchte gerne hier ein paar solcher Realisierungen kurz präsentieren.
Welcher Java Programmierer hat nicht bereits mit folgendem Code in Java Programmen Bekanntschaft gemacht?
long start = System.currentTimeMillis(); // zu messender Code System.out.println("Duration in ms: " + (System.currentTimeMillis() - start));.
Für vereinzelte Messungen mag das ja noch ausreichend sein. Aber werden häufiger Messungen im Code vorgenommen, so ist das doch etwas holprig und es findet sich bald im Projekt eine Utility Klasse namens StopWatch, die dann für einfache Zeitmessungen zuständig ist. Über Implementierungen dieser Art stolpert man bei einer Google Internet Recherche vielfach, zB mit Suchbegriff “Stopwatch Java”. Typische Vertreter dieser Kategorie mit trivialen Implementierungen einer StopWatch bieten meist nicht mehr als in einer einfachen Klasse zwei Methoden zum Starten und Stoppen einer konkreten Messung bzw. zum Abfragen des Messergebnisses. Ich möchte hier keine Code-Fragemente anführen, sondern verweise auf einige Verteter dieser “StopWatch-Gattung”:
- Creating Data Types. , 2007, Robert Sedgewick
- Introduction To Computing II, Dickinson College
- Stopwatch Corey Goldberg
- Java benchmark performance – A Stopwatch
- DZone: StopWatch – Why is my app so slow?
Etwas mehr Komfort bietet die o.a. Beispiel-Implementierung im Artikel auf DZone, wo für Messungen beim Start ein logischer Name vergeben und dann diese benannte Messung unter Angabe des Bezeichners wieder abgefragt werden kann.
Mit Erstaunen habe ich festgestellt, dass oft in meinen Java Projekten bereits Bibliotheken verwendet werden, die in ihrem Funktionsumfang auch eine Stopwatch mit ähnlichem Funktionsumfang mitbringen und die eine eignene StopWatch Utility Klasse überflüssig werden lassen. Als Beispiel möchte ich hier die beiden häufig verwendeten OpenSource Projekte Apache Commons Lang sowie das Spring Framework anführen.
Zum Abschluss möchte ich noch gerne einige mächtigere Bibliotheken erwähnen, die über die naive Implementierung einer einzelnen Java StopWatch Klasse hinausgehen und mehr Funktionalität rund um die Themen Zeit- und Performance-Messung in Form einer Bibliothek bieten.
- Perf4J
- Java Simon – simple monitoring API
- Stopwatch bei SourceForge
Viel Spass beim Zeitmessen!
