Schlagwort-Archive: Performance

Der Performance auf der Spur – Teil 1

Bei Performanceproblemen von Anwendungen mit niedrigen Latenzzeiten merkt der Entwickler schnell, dass die Java Runtime Environment sehr viele versteckte Dinge macht. Sei es, dass BiasedLocking nach 4 Sekunden plötzlich eingeschaltet wird, oder dass der Just-in-time-Compiler (im folgenden „JITC“ genannt) ein Stück Code optimiert, auf jeden Fall kann es Sprünge in der Performance geben, die auf den ersten Blick nicht erklärbar sind.

An verschiedenen Stellen habe ich gelesen, dass der JITC Interfaces unterschiedlich behandelt. Gibt es nur eine Implementierung (der Classloader kann später ggf. weitere nachladen), dann muss kein Code für Polymorphismus generiert werden, sondern die Methode kann direkt aufgerufen werden.

Da es häufig vorkommt, dass zwei Implementierungen eines Interfaces (oder einer abstrakten Klasse) vorliegen, gibt es dafür auch noch eine Optimierung: Der generierte Code prüft mit „instanceof“, welche der Implementierung vorliegt, und muss dann ebenfalls keinen polymorphen Aufruf machen.

Darüber zu lesen ist eine Sache, es auszuprobieren eine andere. Da der JITC erst nach einigen tausend Aufrufen eine Methode optimiert, habe ich mich für das JMH-Framework entschieden, womit sich sehr einfach Microbenchmarks erstellen lassen.

Die ersten Ergebnisse überraschen:

# Run complete. Total time: 00:02:01

Benchmark                                 Mode  Cnt          Score          Error  Units
InliningBenchmark.testBimorphBothTypes   thrpt   20  318966702,179 ±  8259966,525  ops/s
InliningBenchmark.testBimorphSingleType  thrpt   20  320496503,653 ±  6204071,530  ops/s
InliningBenchmark.testMonomorph          thrpt   20  303301715,877 ± 13156878,442  ops/s

Die Performance mit nur einer Implementierung eines Interfaces ist etwas langsamer als der Test mit 2 Implementierungen.

Hat der JITC hier wirklich optimiert? Sind die JMH-Einstellungen (Warmup-Iterationen, Iterationen etc.) richtig gewählt? Ist der Benchmal fehlerhaft?

Diese Fragen möchte ich in den nächsten Blogposts klären, eine Projektbeschreibung mit Beispielcode wird es ebenfalls geben.