ei-staattisen?
onko staattisen metodin kutsu
hitaampi kuin
3405
0Äänestä
Muut lukivat myös
Odottaa vastausta
Näihin keskusteluihin ei ole vielä vastattu. Ole ensimmäinen.
Turvaa tilisi vahvistamalla puhelinnumerosi. Voit silloin palauttaa unohtuneen salasanan tekstiviestillä.
Näihin keskusteluihin ei ole vielä vastattu. Ole ensimmäinen.
Vastaukset 3
Vanhimmat
"As their name implies, instance methods execute instantly, while static methods..." :)
Staattinen metodi on nopeampi koska siinä metodille ei tarvitse välittää this-parametria.
Ei näytä olevan käytännön eroa. Kokeilin alla olevalla ohjelmalla (joka laskee kuinka monta kutsua minuutin aikana ehditään kutsua). Vaihtelemalla kasvata -metodia staattiseksi ja ei staattiseksi, niin samanlaisia arvoja ohjelma käytännössä antoi riippumatta metodin tyypistä.
--- ALKAA ---
public class Laskuri extends Thread {
long arvo;
boolean loppu;
public static void kasvata(Laskuri laskuri) {
laskuri.arvo++;
}
public void run() {
while(!loppu) kasvata(this);
}
public static void main(String[] args) throws InterruptedException {
Laskuri laskuri = new Laskuri();
laskuri.start();
Thread.sleep(1000*60);
laskuri.loppu = true;
System.out.println("Laskuri pääsi arvoon: " + laskuri.arvo);
}
}
--- LOPPUU ---
Tavuu koodissa javap näyttää seuraavaa eroa:
--- ALKAA: EI-STAATTINEN ---
public void kasvata(Laskuri);
Code:
0: aload_1
1: dup
2: getfield #20; //Field arvo:J
5: lconst_1
6: ladd
7: putfield #20; //Field arvo:J
10: return
public void run();
Code:
0: goto 8
3: aload_0
4: aload_0
5: invokevirtual #24; //Method kasvata:(LLaskuri;)V
8: aload_0
9: getfield #26; //Field loppu:Z
12: ifeq 3
15: return
--- LOPPUU ---
--- ALKAA: STAATTINEN ---
public static void kasvata(Laskuri);
Code:
0: aload_0
1: dup
2: getfield #20; //Field arvo:J
5: lconst_1
6: ladd
7: putfield #20; //Field arvo:J
10: return
public void run();
Code:
0: goto 7
3: aload_0
4: invokestatic #24; //Method kasvata:(LLaskuri;)V
7: aload_0
8: getfield #26; //Field loppu:Z
11: ifeq 3
14: return
--- LOPPUU ---
Kuten joku jo totesi, niin ei-staattisessa metodissa pinoon laitetaan hieman enemmän tavaraa, mikä näkyy tuossa tavukoodissakin rivinä: "4: aload_0". Tuo yksi koodirivi kasvattaa suoritettavan koodin määrää n. 7 %:lla, mutta siltikään se ei näytä tulosten valossa vaikutavan nopeuteen. Kaikkihan riippuu loppujen lopuksi siitä, miten Java virtuaalikone kone on tehty, eli miten se suorittaa tuota koodia.