Klitzekleines Problem :-)

Kommt immer drauf an welches Maß der Kapselung benötigt wird und wie sich das ganze Performancemäßig auswirkt. 100000 Methoden Aufrufe sind viiiiiiiel langsamer als 100.000 Zugriffe auf ein public Feld.

Gruß Tom
 
Halli hallo,
ich bin auch eine Art Sauberkeitsfanatiker,
stimmt dass, dass wenn man eine Methode final deklariert, diese quasi als macro vom Compile verwendet wird, also wie in C++ inline-Funktionen?

takidoso
 
Thomas Darimont hat gesagt.:
Kommt immer drauf an welches Maß der Kapselung benötigt wird und wie sich das ganze Performancemäßig auswirkt. 100000 Methoden Aufrufe sind viiiiiiiel langsamer als 100.000 Zugriffe auf ein public Feld.

Gruß Tom

Wieviel ist "viiiiiiiel langsamer" und warum?
 
Hallo!

Code:
import java.awt.Point;

public class Proof {

	public static void main(String[] args) {
		Point[] points = new Point[1000000];
		for (int i = 0; i < points.length; i++) {
			points[i] = new Point((int) (Math.random() * 1000), (int) (Math
					.random() * 1000));
		}

		long time = -System.currentTimeMillis();

		for (int i = 0; i < points.length; i++) {
			int a = (int)points[i].getX();
			int b = (int)points[i].getY();
		}

		System.out.println((time + System.currentTimeMillis()) + "ms");

		time = -System.currentTimeMillis();

		for (int i = 0; i < points.length; i++) {
			int a = points[i].x;
			int b = points[i].y;
		}

		System.out.println((time + System.currentTimeMillis()) + "ms");
	}
}

Ausgabe:
121ms
40ms

Allgemein der direkte Zugriff auf ein Feld ist IMMER schneller als der Zugriff über einen Accessor (getter).

wenn eine Methode als final deklariert worden ist wird sie bei einem Methodenaufruf anders behandelt. Da finale Methoden in abgeleiteten Klassen nicht mehr überschrieben werden können entfällt also ab hier der Aufwand die Virtuelle Methoden Tabelle durchsuchen zu müssen. Das beschleunigt die Ausführung etwas und wie ich gerade in "Performant java Programmieren" lese werden durch gewisse Compiler Optimierungen Methoden die final oder static deklariert werden ge-inlined.

Vom JIT ge-inlined werden kann praktisch jede Methode solange keine Klasse geladen ist die diese Methode überschreibt...

Gruß Tom
 
Zurück