2012-12-05 5 views
3

Je voudrais savoir laquelle des méthodes ci-dessous pourrait être considérée comme plus efficace. Le premier est assez simple, il utilise deux pour les boucles. Le dernier est mon favori personnel, parce qu'il n'en utilise qu'un. Cependant, je ne suis pas tout à fait sûr des avantages et des inconvénients de chaque méthode, car ils sont tous les deux assez rapides.Itération matricielle - Quelle méthode est la plus efficace?

Ils sont destinés à être utilisés avec un CanvasPixelArray ou avec une structure similaire.
w et h représente la largeur et la hauteur des matrices 2D.

for (var y = 0; y < h; y++) { 
    for (var x = 0; x < w; x++) { 

     // ... 
    } 
} 


for (var i = 0, l = w*h; i < l; i++) { 

    var x = i%w; 
    var y = Math.floor(i/w); 

    // ... 
} 
+2

[http://jsperf.com/nested-loop/2](http://jsperf.com/nested-loop/2) vous donnerait une indication pour cela. –

+0

Dans les deux cas, le temps nécessaire pour effectuer une simple opération arithmétique risque d'être réduit par rapport à celui nécessaire pour effectuer des opérations de dessin sur le canevas. La première méthode a l'autre avantage d'être plus facile à lire. – Stuart

Répondre

1

Le premier sera plus efficace. Pensez au nombre d'opérations que vous effectuez dans la première méthode: une seule incrémentation par pixel plus une incrémentation supplémentaire par ligne. L'autre méthode enregistre l'incrémentation supplémentaire par ligne mais la remplace par quelque chose de beaucoup plus complexe. En plus de l'arrondi et du % qui sont chers, la valeur y est recalculée à chaque fois, alors qu'elle n'est calculée qu'une fois par rangée dans la méthode 1. En bref, l'incrémentation supplémentaire par rangée sera beaucoup plus rapide que l'addition de tous ces opérations supplémentaires par pixel. Cela ne veut pas dire que vous ne devriez pas utiliser la seconde méthode, mais étant donné le code que vous avez affiché, le premier fonctionnera mieux.

+0

Mh bien, merci à vous deux. Même si ça me fait mal de laisser mon fantaisie en boucle, je suppose que je vais aller avec le premier à partir de maintenant. –

+0

Juste ré-édité ... comme je l'ai dit ce n'est pas que vous ne devriez pas utiliser le second (peut-être vous effectuez déjà ces calculs ailleurs et pouvez réutiliser les valeurs, en réduisant le coût de l'itération) mais si vous cherchez pour la performance, le premier devrait encore un peu mieux performer. –

Questions connexes