Optimer dine loops

by Jesper august 20, 2009 23:06

Jeg, og sikkert også du, har hundrede vis af gange skrevet en JavaScript for-next løkke på følgende måde:

for (var i=0; i<arr.length; i++)
{
    //Ya-di-ya
}

Var du klar over at man kan optimerer den løkke med en faktor 1:8 ved at lave en minimal ændring af koden?

Det viser sig nemlig, at løkken bruger en del kræfter på at udregne arr.length i hvert gennemløb. Hvis man der imod checker mod en variabel med værdin, kører det hele langt mere gnidningsløst. Se følgende test:

    var array = new Array(100000);

    var loop1 = function() {
        var ctr = 0;
        for (var i = 0; i < array.length; i++) {
            ctr++;
        }
        return ctr;
    }
    var loop2 = function() {
        var ctr = 0;
        var l = array.length;
        for (var i = 0; i < l; i++) {
            ctr++;
        }
        return ctr;
    }
    window.onload = function() {
            loop1();
            loop2();
    }

Et array med 100.000 elementer loopes igennem. Loop1 checker mod array.length og loop2 mod variablen l.

Og resultatet:

image

Loop2 kører over 4 gange hurtigere! Gevinsten bliver større, jo flere elementer der er i array’et.

Somme tider er det i detaljen, at de store besparelser ligger gemt.

Code on…

Tags:

JavaScript | Tip

Kommentarer

21-08-2009 09:32:55 #

Mark S. Rasmussen

Mikro optimering er interessant at studere, men sjældent værd at gå amok med i produktion. I dit loop 1 eksempel looper du 100.000 værdier med en gennemsnitlig gennemløbstid på 0,000625 sekunder. Hvor ofte looper vi 100k værdier i JS?

Eksemplet er relativt harmløst, men ofte vil downsides ved at mikrooptimere være større end de gevinster der er. Code readability er ikke værd at ofre blot for at spare 0,0004687 sekunder pr. gennemløb - med mindre vi vitterligt looper millioner af elementer.

Mark S. Rasmussen Denmark

21-08-2009 11:13:07 #

Jesper

@Mark> Du har ret i din antagelse - isoleret set, kan man ikke argumenterer for at lave den slags microoptimeringer, men jeg mener at man kan bruge den slags benchmarks til at give sig selv gode vaner. Jeg vil i al tid fremover skrive min kode med den optimering, og de 10 andre microoptimeringer jeg har i mit repetoir, og på den måde vil min base blive bedre - tror jeg Smile

Jesper Denmark

21-08-2009 13:21:55 #

Nis Wilson Nissen

Jeg synes at det er fint at skrive:

for (var i = 0, len = arr.length; i < len; i++) {
  // Do stuff
}

Det fylder stort set det samme som en "almindelig" for-løkke, men kører lidt hurtigere.

Cheers,
Nis

Nis Wilson Nissen Denmark

Kommentarerne er lukkede

Powered by BlogEngine.NET 1.5.0.7
Theme by Mads Kristensen | Modified by Mooglegiant

About

Mit navn er Jesper Jensen, og jeg arbejder til dagligt som web-udvikler hos DGI, hvor mit speciale er klientside applikationer. Før det var jeg nogle år i robotbranchen, hvor jeg arbejdede med 3D simulering og system koordinering. Jeg elsker webudvikling, og specielt JavaScript har min interesse. Jeg har blogget om mine oplevelser med udvikling siden 2004

Calendar

<<  juli 2010  >>
mationtofr
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

View posts in large calendar

RecentComments

Comment RSS