Java Performance

Über die Frage welche Operation wieviel Zeit benötigt wird viel und wild spekuliert.
Es werden zahlreiche trickreiche Optimierungen gebastelt – oft von geringem Nutzen und größter Unübersichtlichkeit.

Um etwas Licht ins Dunkel zu bringen habe ich unlängst auf meinem P4- 3,2GHz System unter WinXP und JDK 1.4.2 ein paar Messungen durchgeführt. Ein Takt dauert auf dieser Maschine 0.31ns

h3. Methodenaufruf

| Aufruf eines Setters für ein non-primitive Attribut|>. 1,1 ns|
| Downcast (dynamische Typprüfung)|>. 3 ns|
| Aufruf über Reflection|>. 400 ns|
| Method Lookup|>. 3200 ns|
| HashMap.put mit 4-16 Zeichen Schlüssel und 4-12 verschiedenen Schlüsseln|>. 80 ns|
| HashMap.get mit existierendem Schlüssel|>. 53 ns|
| HashTable.putmit 4-16 Zeichen Schlüssel und 4-12 verschiedenen Schlüsseln|>. 190 ns|

h3. Dateien Schreiben, konstanter Anteil
| Testmachine (Win XP, NTFS) |>. 2000000 ns|
|PIII Celeron 1GHz and (Linux, ReiserFS): |>. 500000 ns|

h3. Objekterzeugung
| Erzeugung einer Stringinstanz aus einem Literal|>. 85ns|

Erzeungung eines Objects mit n non-primitive fields
| n | t |
|>. 2|>. 56 ns|
|>. 4 |>. 59 ns|
|>. 8 |>. 68 ns|
|>. 16|>. 86 ns|

h3. Moral

Bei Optimierungen ist zu beachten, dass zwischen den verschiedenen Operationen teilweise sogar mehrere _dezimale_ Größenordnungen liegen.
Es lohnt sich also beispielsweise kaum einen Comparator über mehrere Sortiervorgänge zu cachen.
Außerdem sollte man im Auge behalten, wie oft eine Operation ausgeführt wird und welche OPeration die Laufzeit dominiert.

2 Comments

  1. kiu says:

    Imho sollte man sich beim Entwickeln um Performance generell keine Gedanken machen (zumindest auf solch einer niedrigen Ebene).

    “As a rule, 90 percent of a program’s excution time is spent executing 10 percent of the code.”

    Wenn man ein funktionierendes Programm hat, kann man am Ende einen Profiler drueberjagen (java -prof helloworld) und die Bottlenecks identifizieren.

  2. felix says:

    Prinzipiell ist das richtig und die Messungen hatte ich unter anderem vorgenommen, um das zu zeigen.
    Denn Objekterzeugung ist billig und Methodenaufrufe auch, man kann hier also getrost ein schönes Design machen.

    Allerdings muss beachtet werden, dass bestimmte Operationen _sehr_ viel teurer sind. Insbesondere bei verteilten Anwendungen muss man da schon beim Design ein wenig aufpassen.

    Das ist alles relativ klar. Aber es ist erschreckend wie viele Leute als IT-Spezialisten rumlaufen und noch nie einen Profiler angeschmissen haben.
    Leute die gerne einmal mehr zur DAtenbank laufen, “weil die schneller sortiert”.

    Übrigens auch unverschämt ist JProbe. Ein sauteures Tool, das eine vollkommen kaputte Benutzeroberfläche hat – Swing at its worst.

Leave a Reply