Mystisk performance-problem
Jeg afvikler nedenstående program:public class Performance {
public static void main(String[] args) {
Performance p = new Performance();
p.exec();
}
public void exec() {
int antal = 1000000000;
long start, slut;
start = System.currentTimeMillis();
A a = new A();
for (int i = 0; i < antal; i++) {
a.method();
}
slut = System.currentTimeMillis();
System.out.println("Tid: " + 0.001 * (slut - start) + " sek.");
B b = new B();
b.method();
}
class A {
void method() {
}
}
class B extends A {
@Override
void method() {
}
}
}
Resultat:
Tid: 0.43 sek.
Jeg ændrer nu linien:
B b = new B();
- til:
A b = new B();
Resultat herefter:
Tid: 2.86 sek.
Denne ændring har åbenbart dramtisk virkning på den foregående for-løkke, hvordan kan det forklares? Programmet afvikles med JDK 1.7, 32-bit.
Bem:
Jeg kan til nød forstå, at ændring af linien:
A a = new A();
- til:
A a = new B();
- giver tilsvarende performance-problem, da denne indgår i for-løkken (noget med implicit cast, der tager tid?), men den anden ændring kommer jo efter for-løkken og har intet med denne at gøre.