Den mest effektive repeater i JavaScript

by Jesper juli 27, 2009 12:36

Hvordan ser den mest effektive repeater ud i JavaScript?

Ved repeater forstår jeg en funktion, der kan gentage en streng n gange. Jeg bruger den slags repeatere i udstrakt grad, når jeg laver jQuery-plugins, så der ligger en potentiel forbedring af mine moduler, hvis jeg kan tune lidt på det område. Den mest oplagte måde at gentage, er ved hjælp af en for-next løkke:

String.prototype.repeatWithForNext = function(n) {
     var ret;
     for (var i = 0; i < n; i++)
         ret += this;
     return ret;
}
// Brug:
"Gentag dette".repeat(10);

Blandt mange jQuery-udviklere, er det meget udbredt at bruge en metode hvor man konstruerer et array objekt, med n+1 antal tomme elementer, og så kalder join med strengens som separatorparameter:

String.prototype.repeatWithArray = function(n) {
    var arr = new Array(n + 1);
    return arr.join(this);
};

Metoden er smart, men på mange niveauer forkert. Man bruger et objekt og dets funktioner på en utilsigtet måde, og resultatet er overraskende – smart.

Hvis man bruger IE’s script profiler, og laver en sammenligning mellem de to metoder, får man følgende resultat:

image

Array metoden er ca. 40% hurtigere.  Det synes jeg måske er lidt overraskende, da man jo bruger et noget mere avanceret objekt.

Hvad så hvis man bruger en kombination af Array og Regex objektet? Jeg forsøgte bare for sjov, for det lyder jo ikke så effektivt vel:

String.prototype.repeatWithArrayAndRegex = function(n) {
    var ret = new Array(n+1).join(" ");
    return ret.replace(/./g, this);
}

Resultatet:

image

Wroooom! - Den metode er 66% hurtigere end for-next løkken. Jeg har reduceret processtiden på min jQuery-plugin med ca 30 %.

Som Rembrandt udtrykte det: “De ware schoonheid schuilt in de details.”.

Code on…

Tags:

JavaScript

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