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.
* forskellen paa 32 og 64 bit skyldes at 64 bit JVM opdager at loekken og metoden intet goer og optimerer det hele vaek mens 32 bit JVM udfoerer det hele
* forskellen mellem B=new B og A=new B er at med B=new B saa vil alle A ref pege paa et A objekt og kaldet af method kan derfor hardcodes til A.method mens A=new B goer at method er en virtuel metode som kraever et lookup inden kald
Lige som #2 siger, så vil jeg også gætte på, at det skyldes at du får et række pagefaults, da oversætteren ikke får optimeret koden ordentligt, og din TLB derved vil være fyldt med invalide frames.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.