|
| Erklæring af variabler i Fra : Martin Møller Bæk |
Dato : 24-07-02 11:47 |
|
Hej
Hvis man har en løkke, hvori man vil bruge en
eller anden variabel i hver gennemgang i løkken,
er det så bedst at erklære den inden i løkken (A)
eller lige ovenfor (dvs udenfor) løkken(B)?
Eller er det en smagssag?
Jeg tænker lidt på performance forskelle,
omend der måske ofte ikke er den store forskel.
Under A vil 's' hele tiden blive oprettet, men
tilgengæld er man af med den, når løkken slutter,
hvorimod man hænger på den bagefter i B.
Mvh.
Martin MB.
ex. A:
for(int i=0; i<10; i++)
{
String s = ....
foo(s);
........
}
ex. B:
String s;
for(int i=0; i<10; i++)
{
s = ....
foo(s);
........
}
| |
Lars Dam (24-07-2002)
| Kommentar Fra : Lars Dam |
Dato : 24-07-02 12:14 |
|
On Wed, 24 Jul 2002 12:47:27 +0200, Martin Møller Bæk
<martin@nospam.aflame.dk> wrote:
>Jeg tænker lidt på performance forskelle,
>omend der måske ofte ikke er den store forskel.
>Under A vil 's' hele tiden blive oprettet, men
>tilgengæld er man af med den, når løkken slutter,
>hvorimod man hænger på den bagefter i B.
>
Det har ikke den helt store betydning, idet det kun er reference du
snakker om. Det der tæller er om du instantierer, eller fremhenter et
objekt (f.eks. s = new String(), eller s = (String)vector.elementAt(i)
).
Førstnævnte er tung, den anden ikke.
Så istedet for at tænke performance når du definerer dine referencer,
så smid dem så langt inde i dit scope som muligt, da det ikke er dem
der giver udslag på performance, men tilgengæld, får du en bedre
(pænere/forståelig) kode.
>Mvh.
>Martin MB.
>
vh. ld
---
"Time is the fire in which we burn"
| |
Martin Møller Bæk (24-07-2002)
| Kommentar Fra : Martin Møller Bæk |
Dato : 24-07-02 19:39 |
|
Lars Dam wrote:
> Så istedet for at tænke performance når du definerer dine referencer,
> så smid dem så langt inde i dit scope som muligt, da det ikke er dem
> der giver udslag på performance, men tilgengæld, får du en bedre
> (pænere/forståelig) kode.
>
Ok, tak. Så gør jeg det.
/Martin
| |
Niels Ull Harremoës (26-07-2002)
| Kommentar Fra : Niels Ull Harremoës |
Dato : 26-07-02 11:07 |
|
Hvis du erklærer variablen inde i løkken vil det muligvis give
oversætteren/JIT-vm'en bedre muligheder for at optimere, da den så evt kan
smide variablen helt væk. Det kræver en (lidt) tungere analyse, hvis
variablen er erklæret uden for løkken - og JIT oversættere bruger sjældent
tid på tunge analyser.
Fx kan oversætteren omskrive
for(int i=0; i<10;i++) {
int x = 10 * i + 4;
doSomething(x);
}
til
for(int i=0; i<10;i++) {
doSomething(10 * i + 4);
}
og måske endda til
for(int i=4; i<104;i+=10) {
doSomething(i);
}
omend denne sidste omformning nok kun foretages af "tunge" oversættere.
Hvis du er rigtig nysgerrig, kan du jo prøve at se på bytecoden for begge
løsninger og finde ud af om der er forskel? Evt benchmarke (med alle de
forbehold, der er i en benchmark). Men performancemæssigt er vi nok langt
nede i detaljerne.
Rent stilmæssigt går jeg også klart ind for at erklære variablen så lokalt
som muligt. Det gør programmet mere læseligt og robust over for rettelser,
da man nu kun behøver "bekymre" sig om x inde i løkken. Så hvis en anden
løkke lidt længere nede også bruger x, behøver udvikleren ikke spekulere
over, om det nu er den sidst beregnede værdi fra den forrige løkke der
bruges osv.
Niels Harremoës
"Martin Møller Bæk" <martin@nospam.aflame.dk> wrote in message
news:3D3EF461.7050702@nospam.aflame.dk...
>
>
> Lars Dam wrote:
>
> > Så istedet for at tænke performance når du definerer dine referencer,
> > så smid dem så langt inde i dit scope som muligt, da det ikke er dem
> > der giver udslag på performance, men tilgengæld, får du en bedre
> > (pænere/forståelig) kode.
> >
>
>
> Ok, tak. Så gør jeg det.
>
> /Martin
>
| |
|
|