ACM schreef op woensdag 26 januari 2011 @ 14:16:
Het is vooral een gut-feeling dat (private) variabelen binnen een klasse - of zelfs wellicht binnen een functie - sneller zijn dan die buiten een klasse vandaan halen (zie ook .oisyn's reactie).
Misschien moeten we het even wat concretiseren. Stel je hebt code als deze:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
| class Bar {
public int[] a;
public get(int i) { return a[i]; }
}
class Foo {
private int[] a;
private Bar bar;
int methode1(Bar bar) {
int res = 0;
for (int i = 0; i < 10; ++i) res += bar.a[i];
return res;
}
int methode2() {
int res = 0;
for (int i = 0; i < 10; ++i) res += a[i]; // a[i] == this.a[i]
return res;
}
int methode3(Bar bar) {
int res = 0;
for (int i = 0; i < 10; ++i) res += bar.get(i);
return res;
}
int methode4() {
int res = 0;
for (int i = 0; i < 10; ++i) res += bar.a[i]; // this.bar.a[i]
return res;
}
} |
Er is mijns inziens weinig verschil in performance te verwachten tussen deze methoden. De eerste methode refereert alleen aan
bar, en de tweede alleen aan
this; voor de compiler is dat vergelijkbaar (er is geen reden waarom
this magischerwijs efficiënter zou zijn.) De derde methode roept een bar.get() aan, maar deze call kan eenvoudig geïnlined worden, en dan is de code equivalent aan de eerste methode.
De eerste methode heeft een extra parameter wat in theorie een klein verschil kan maken, maar als de methode zelfde geïnlined kan worden verdwijnt dat voordeel ook.
De vierde methode is wat .oisyn bedoelde: om een referentie naar
bar te krijgen moet je eerst aan
this refereren wat een extra stap oplevert, en een extra cache miss. Maar in loops zoals deze kan de compiler deze extra stap buiten de lus halen, en sowieso is de overhead daarvan heel klein.
Al deze verschillen zijn dermate klein dat ik niet denk dat het zinnig is er in dit stadium voor te optimaliseren, zeker aangezien we het over GUI code hebben. Als die traag is, komt dat meestal omdat er teveel (her)berekend en (her)tekend wordt, en zijn er meestal zinnigere optimalisaties te vinden dan dit soort micro-optimalisaties die de leesbaarheid van de code niet ten goede komen.