Thorbjørn Ravn Andersen wrote:
> Morten Jensen wrote:
>
>> Switch bliver compileret til noget smartere end if-elseif. Switch har jo
>> den optimeringsfordel, at den arbejder med konstanter, så compileren kan
>> udregne resultaterne af alle case's med det samme.
>>
>> (og jeg har checket det med javap) :)
>
> Det er jo godt nok
>
> Kan du ikke være en lille smule mere præcis?
Det er ikke noget, som jeg ved noget specielt om, men jeg kan da vise,
hvordan jeg kom frem til ovenstående konklusion.
Jeg lavede en klasse med følgende to funktioner:
public void switchtest(int i)
{
switch(i)
{
case 0:
i++;
break;
case 1:
i++;
break;
case 2:
i++;
break;
}
}
public void iftest(int i)
{
if(i == 0)
i++;
else if(i == 1)
i++;
else if(i == 2)
i++;
}
Med javap -c <klasse> fik jeg følgende resultat for de to funktioner:
Method void iftest(int)
0 iload_1 // Hent variable 1 (metodeparameteren)
1 ifne 10 // Hvis den ikke er 0 gå til 10
4 iinc 1 1 // Læg 1 til variable 1
7 goto 29 // Gå til 29
10 iload_1 // Hent variable 1
11 iconst_1 // Hent konstanten 1
12 if_icmpne 21 // Hvis ikke ens, gå til 21
15 iinc 1 1 // Læg 1 til variable 1
18 goto 29 // Gå til 29
21 iload_1 // Hent variable 1
22 iconst_2 // Hent konstanten 2
23 if_icmpne 29 // Hvis ikke ens, gå til 21
26 iinc 1 1 // Læg 1 til variable 1
29 return // Return
Method void switchtest(int)
0 iload_1 // Hent variable 1 (metodeparameteren)
1 tableswitch 0 to 2: default=46
0: 28 // Hvis 0 gå til 28
1: 34 // Hvis 1 gå til 34
2: 40 // Hvis 2 gå til 40
28 iinc 1 1 // Læg 1 til variable 1
31 goto 46 // Gå til 46
34 iinc 1 1 // Læg 1 til variable 1
37 goto 46 // Gå til 46
40 iinc 1 1 // Læg 1 til variable 1
43 goto 46 // Gå til 46
46 return // Return
Som man kan se, så skal iftest hele tiden hente variable, hente
konstanter og sammenligne, så hvis det er den sidste case man er
interesseret i, så skal den igennem en del.
Det kommer selvfølgelig altsammen an på hvordan jvm'en har implementeret
tableswitch instruktionen.
--
CAPUT A/S Morten Jensen Phone +45 70 12 24 42
Nygade 6 Senior Developer Fax +45 70 11 24 42
DK-1164 Kbh K jensen@caput.com
http://www.caput.com