Avatar billede jespersahner Nybegynder
05. marts 2014 - 01:58 Der er 4 kommentarer

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.
Avatar billede arne_v Ekspert
05. marts 2014 - 02:16 #1
Mine tal for 1.7u51 paa min hjemme PC:

            32 bit        64 bit
new A        0.592        0.0
new B        2.995        0.0

Der sker noget funky!
Avatar billede arne_v Ekspert
05. marts 2014 - 02:23 #2
Hvis jeg skal gaette saa:

* 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
Avatar billede arne_v Ekspert
05. marts 2014 - 02:25 #3
#1

new A skal vaere B=new B
new B skal vaere A=new B

koden er rigtig (hvilket resultaterne som ligner dine ogsaa bekraeftiger) men jeg vroevlede ved indtastning
Avatar billede conz Juniormester
05. marts 2014 - 18:23 #4
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.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester