Java interne Performance

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.

Gruß, Lars

Hallo.

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.

Klingt nach dem ‚Java-Knigge‘ von M. Wiedeking von mathema.de
Et voila: http://www.mathema.de/event/publikation/guidelines.html
Allerdings hat manch einer diesen Optimierungsmethoden ein böses Zeugnis ausgestellt: http://www.entwickler-forum.de -> Java -> Leserbriefe zum Java Magazin (Stichwort im Header: Knigge)

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…

HTH
mfg M.L.

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.

Schlechter Stil.

„Use Exceptions only for exceptional conditions“

[Quelle: Effective Java, J. Bloch (Item 39)]

Gruss, Patrick

Hallo,

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.

Gruß

Peter

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

>>>variablendeklarationen ausserhalb von schleifen

was soll das bringen?
ob du
String s;
for(…) {
s = …
}
oder
for(…) {
String s = …
}
schreibst sollte doch egal sein, oder?

Hallo,

ob du
String s;
for(…) {
s = …
}
oder
for(…) {
String s = …
}
schreibst sollte doch egal sein, oder?

IMHO ist dies nicht dasselbe. Siehe auch /t/programmierstil–2/2620520

Ciao, Bill

nein!!!

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.

Gruß Peter