Hy,
ich bin immer sehr an hochperformanten Java-Programmen interessiert und habe dabei immer Tipps von meinem größeren Bruder bekommen, wie zum Beispiel:
Statt einer for-Schleife mit einer Berechnung in der Abbruchbedingung, lieber eine while(true)-Schleife in einen try-catch Block stecken und die Schleife absichtlich in eine Exception laufen zu lassen.
Oder der Hinweis, dass Java intern alle Byte-, Char-, Boolean-Typen in Integer umwandelt, die Berechnung durchführt und wieder zurückkonvertiert.
Oder, dass Java auf Variablen, die in den ersten 4Byte von lokalen Methoden deklariert sind, schneller zugreift.
Meine Frage ist nun: Woher bekommt man solche Informationen?
Manchmal kann man sich ja den Quellcode der Java-Classes anzeigen lassen. Aber ich glaube kaum, dass in diesen class-Dateien Informationen über das interne Typ-Konvertieren zu finden sind.
Hy,
ich bin immer sehr an hochperformanten Java-Programmen
interessiert und habe dabei immer Tipps von meinem größeren
Bruder bekommen, wie zum Beispiel:
Statt einer for-Schleife mit einer Berechnung in der
Abbruchbedingung, lieber eine while(true)-Schleife in einen
try-catch Block stecken und die Schleife absichtlich in eine
Exception laufen zu lassen.
Oder der Hinweis, dass Java intern alle Byte-, Char-,
Boolean-Typen in Integer umwandelt, die Berechnung durchführt
und wieder zurückkonvertiert.
Oder, dass Java auf Variablen, die in den ersten 4Byte von
lokalen Methoden deklariert sind, schneller zugreift.
Meine Frage ist nun: Woher bekommt man solche Informationen?
Dazu könnte man im Quellcode der Virtual Machine selbst nachschauen.
Obwohl der Weg über das Programmieren der verschiedenen Codes und dem Nachmessen mit einer Uhr wohl einfacher wäre…
Statt einer for-Schleife mit einer Berechnung in der
Abbruchbedingung, lieber eine while(true)-Schleife in einen
try-catch Block stecken und die Schleife absichtlich in eine
Exception laufen zu lassen.
also das mit der Exception halte ich auch für schlecht. Gute Programme sind auch gut lesbar. Das ist oft wichtiger, als das letzte bisschen Performance.
Außerdem kann sich diese Optimierungstechnik nach einem Versionswechsel ins Gegenteil verkehren. Lesbarer Code bleibt aber lesbar.
Profiler
besser als die besten tipps sind die richtigen algorhytmen
die „kleinen tipps“ deines freundes können nie die ersparnis ersetzen, die ein gut durchdachter Algorhytmus bringt
um sowas selber zu testen, kann man sogennante „Profiler“ benutzen, um zB 2 Methoden, die das gleiche machen, aber anders formuliert sind, zu vergleichen
nette kleine Tipps noch nebenbei
>>>Objekte möglichst vermeiden und auf einfache Datentypen setzen
>>>variablendeklarationen ausserhalb von schleifen
ein Objekt s wird angelegt
(String ist intern meisst char[] = Array = Objekt)
dabei geschehen folgende Schritt
-> PC sucht nach freiem speicher
-> PC reserviert, ja nach Objektgrösse freien Speicher
-> PC speichert die Addresse auf s
erst dann, was in beiden schleifen passiert,
-> PC speichert Daten auf Addresse s
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Hy,
ich bin immer sehr an hochperformanten Java-Programmen
interessiert und habe dabei immer Tipps von meinem größeren
Bruder bekommen, wie zum Beispiel:
Statt einer for-Schleife mit einer Berechnung in der
Abbruchbedingung, lieber eine while(true)-Schleife in einen
try-catch Block stecken und die Schleife absichtlich in eine
Exception laufen zu lassen.
Nicht böse gemeint! Wenn Du eine Iteration brauchst und nicht
weißt wie Du die Abbruchbedngung außerhalb der Schleife
programmierst, dann lass es lieber. In der reinen Informatik
gibt es den Begriff der INVARIANTEN. Dies ist die Schleifenvariable
die vor oder am Ende der Schleife getestet wird. Der Name kommt
daher, dass diese Variable innerhalb der Schleife nicht berechnet
oder manipuliert werden darf. Allan Turing hat auf
dieser Annahme eine halbwegs passable Lösung gefunden, wie das
Halteproblem (Wann weiß eine Maschine : Habe Fertig!) zumindest mit
Einschränkungen zu lösen ist. Wer in der Schleife die Variable
berechnet erlebt häufig unerwünschte Seiteneffekte.
Oder der Hinweis, dass Java intern alle Byte-, Char-,
Boolean-Typen in Integer umwandelt, die Berechnung durchführt
und wieder zurückkonvertiert.
Kann ich für den Mac z.B. nicht bestätigen, dort scheint die APPLE VM
den Driss in den Prozessor auszulagern und nativ zu rechnen. Beim XP
habe ich den Effekt auch noch nicht beobachtet.
Oder, dass Java auf Variablen, die in den ersten 4Byte von
lokalen Methoden deklariert sind, schneller zugreift.
Meine Frage ist nun: Woher bekommt man solche Informationen?
Manchmal kann man sich ja den Quellcode der Java-Classes
anzeigen lassen. Aber ich glaube kaum, dass in diesen
class-Dateien Informationen über das interne Typ-Konvertieren
zu finden sind.
Im Grunde hilft nur Testen. Ich fahre auf unterschiedlichen Rechnern
(Mac, Linux, W2000 und XP) unterschiedliche VM’s und stelle immer
wieder fest, dass Unterschiede existieren. Im Ergebniss habe ich
herausgefunden, dass die eingebauten Optimierer nur mit sauber
strukturietem Code (siehe oben) klarkommen und performant cachen.