onko staattisen metodin kutsu

ei-staattisen?
3405
Äänestä

Muut lukivat myös

Vastaukset 3

Vanhimmat

"As their name implies, instance methods execute instantly, while static methods..." :)

Äänestä

Staattinen metodi on nopeampi koska siinä metodille ei tarvitse välittää this-parametria.

Äänestä

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.

Äänestä

Kommentoi aloitusta


hitaampi kuin kirjoitti:

ei-staattisen?

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu