83 votes

Sommation JavaScript la plus rapide

Quel est le moyen le plus rapide de résumer un tableau en JavaScript ? Une recherche rapide permet de trouver quelques méthodes différentes mais je voudrais une solution native si possible. Ce programme fonctionnera sous SpiderMonkey.

Penser très à l'intérieur de la boîte que j'ai utilisée :

var count = 0;
for(var i = 0; i < array.length; i++)
{
    count = count + array[i];
}

Je suis sûr qu'il y a un meilleur moyen que l'itération directe.

3 votes

TEST ! !! Si vous voulez savoir quel est le moyen le plus rapide de faire quelque chose, essayez-en plusieurs, et mesurez les résultats.

4 votes

@Chad : Bien évidemment, mais je ne suis pas dans mes jours de "pensée hors de la boîte".

165voto

ChaosPandion Points 37025

Vous devriez être en mesure d'utiliser reduce .

var sum = array.reduce(function(pv, cv) { return pv + cv; }, 0);

Source :

Et avec fonctions de la flèche introduit dans l'ES6, c'est encore plus simple :

sum = array.reduce((pv, cv) => pv + cv, 0);

1 votes

Selon la documentation liée, "[réduire] peut ne pas être disponible dans tous les navigateurs".

0 votes

@Tim : Encore une fois, cela fonctionne sous SpiderMonkey, pas sous un navigateur particulier.

0 votes

Ah, désolé, j'ai raté ça. Dans ce cas, c'est la réponse.

35voto

vol7ron Points 11270

Améliorations

Votre structure de bouclage pourrait être plus rapide :


   var count = 0;
   for(var i=0, n=array.length; i < n; i++) 
   { 
      count += array[i]; 
   }

Cela permet de récupérer array.length une fois, plutôt qu'à chaque itération. L'optimisation se fait par la mise en cache de la valeur.

Si vous voulez vraiment accélérer le processus :


   var count=0;
   for (var i=array.length; i--;) {
     count+=array[i];
   }

C'est l'équivalent d'une boucle inversée while. Elle met en cache la valeur et la compare à 0, d'où une itération plus rapide.

Pour une liste de comparaison plus complète, voir mon JSFiddle .
Nota: array.reduce y est horrible, mais dans la console de Firebug, il est le plus rapide.


Comparer les structures

J'ai commencé un JSPerf pour les sommations de tableaux. Il a été construit rapidement et il n'est pas garanti qu'il soit complet ou précis, mais c'est ce que nous faisons. modifier est pour :)

21voto

Inkh Su Tesou Points 43

En cherchant la meilleure méthode pour additionner un tableau, j'ai écrit un test de performance.

Dans Chrome, "réduire" semble être largement supérieur.

J'espère que cela vous aidera

// Performance test, sum of an array
  var array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
  var result = 0;
// Eval
  console.time("eval");
  for(var i = 0; i < 10000; i++) eval("result = (" + array.join("+") + ")");
  console.timeEnd("eval");
// Loop
  console.time("loop");
  for(var i = 0; i < 10000; i++){
    result = 0;
    for(var j = 0; j < array.length; j++){
      result += parseInt(array[j]);
    }
  }
  console.timeEnd("loop");
// Reduce
  console.time("reduce");
  for(var i = 0; i < 10000; i++) result = array.reduce(function(pv, cv) { return pv + parseInt(cv); }, 0);
  console.timeEnd("reduce");
// While
  console.time("while");
  for(var i = 0; i < 10000; i++){
    j = array.length;
    result = 0;
    while(j--) result += array[i];
  }
  console.timeEnd("while");

eval : 5233.000ms

boucle : 255.000ms

réduire : 70.000ms

while : 214.000ms

3 votes

Merci pour cela, mais pourquoi faut-il qu'il y ait une parseInt dans la fonction de réduction ? J'ai essayé et j'en avais besoin dans mon code aussi.

0 votes

Hmm, je ne suis pas sûr, essayez sans le parseInt J'ai écrit ceci il y a 4 ans : D

14voto

Biereagu Sochima Points 347

Ou tu peux le faire de la mauvaise façon.

var a = [1,2,3,4,5,6,7,8,9];

sum = eval(a.join("+"));

;)

0 votes

Eval() ne doit jamais être utilisé

0 votes

Aussi connu sous le nom de méthode LISP :)

8voto

CaffGeek Points 10925

La boucle la plus rapide, selon ce test est un while loop à l'envers

var i = arr.length; while (i--) { }

Donc, ce code pourrait être le plus rapide que vous pouvez obtenir

Array.prototype.sum = function () {
    var total = 0;
    var i = this.length; 

    while (i--) {
        total += this[i];
    }

    return total;
}

Array.prototype.sum ajoute une méthode de somme à la classe des tableaux... vous pourriez facilement en faire une fonction d'aide à la place.

0 votes

Ma marche arrière est légèrement plus rapide, la plupart du temps.

0 votes

@vol7ron, très, très, très marginalement, nous parlons de ~1ms sur 1000 enregistrements.

0 votes

:) oui oui et pas à chaque fois non plus. tout de même, je suis plus susceptible d'utiliser for(var i=0,n=a.length;i<n;i++){} en raison de la structure de contrôle marche/arrêt.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X