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.

This entry was posted in Uncategorized. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.