2010-09-29 3 views
1

test ici: http://jsperf.com/test-for-speed-of-various-conditionalsPourquoi Safari offrirait-il des résultats presque opposés ici?

Je suis intéressé si d'autres obtiennent les mêmes résultats, et ce que les gens pourraient penser pourquoi les résultats varient (en particulier w/Safari.) À travers les navigateurs. Intéressant est comment démocratiquement Firefox gère les différents cas.

S'il vous plaît informer s'il y a quelque chose de terriblement mal avec ma méthode :)

Firefox 3.6/Mac OS X 10,64: Switch = 824,352 Ops/sec (14% plus lent)
Si/else = 530062 (44% Plus lente, lente)
Hash/lazy = 968.035 (la plus rapide)
Hash/if/else = 963.765 (0% plus lente)

Chrome 10,64 6.0.472.63/Mac OSX:
Switch = 10,220,039 Ops/sec (62% plus lent)
Si/else = 7744284 (71% Plus lent, Slowest)
Hash/lazy = 27130039 (le plus rapide)
Hash/if/else = 25297370 (6% Plus lent)

Safari 5.0.2/Mac OS X 10,64:
Switch = 15,044,132 Ops/sec (le plus rapide)
Si/else = 1793051 (88% Plus lent, Slowest)
Hash/lazy = 10381941 (30% Plus lent)
Hash/if/else = 11119576 (26% Plus lent)

Opera 10.10/Mac OSX 10.64: ​​
Switch = 497,238 Ops/s (32% plus lente)
Si/else = 250904 (66% plus lente, lente)
Hash/lazy = 740.520 (la plus rapide)
Hash/if/else = 634424 (14% plus lente)

MSIE 8.0/Windows NT:
Switch = 176,267 Ops/s (60% Plus lent)
Si/else = 124783 (72% Plus lent, Slowest)
Hash/lazy = 447421 (le plus rapide)
Hash/if/else = 442,736 (14% plus lent)

+0

Quelle est la question à nouveau? – spender

+0

Le conseil général est de ne pas utiliser switch(), optant plutôt pour une sorte de recherche. Et ce conseil vaut pour tous les navigateurs sauf pour Safari - où le switch est en fait le plus rapide, de loin. Je me demandais d'abord si j'avais des hallucinations, et la seconde si quelqu'un sait pourquoi cela serait (en particulier étant donné que Chrome ne montre pas ce comportement). –

+0

Bien que Chrome et Safari utilisent WebKit pour le rendu, ils ont différents moteurs JavaScript (V8 pour Chrome et Nitro pour Safari). – Chuck

Répondre

2

Javascript a une spécification mais il ne définit pas l'implémentation; Il appartient aux fournisseurs de navigateurs de déterminer comment implémenter la spécification (ce qui entraîne également de nombreux problèmes entre les navigateurs, bien qu'ils s'améliorent à ce sujet dernièrement). Il est probable que la façon dont les différents navigateurs implémentent les différentes méthodes que vous utilisez diffère.

0

Ce ne sont pas des tests vraiment justes. La raison pour laquelle la recherche directe est plus rapide est parce que tous les autres tests font exactement la même recherche au-dessus d'une vérification conditionnelle. Et il n'y a aucune raison d'écrire du code comme:

if (t == 'e') c['e']; 

Ceci est une violation évidente de DRY (Do not Repeat Yourself), et vous faire économiser habitude tout moment en utilisant une chaîne littérale dans la recherche que le contenu de la variable t doit encore être récupérée pour la comparaison.

également

if (c[t]) c[t](); 

est tout aussi paresseux que

c[t] && c[t](); 

Quant à savoir pourquoi Safari offre de tels résultats opposés, je ne sais pas, comme il est logique que l'opération » a + opération b < opération a ". Il convient juste de noter que les tests de performance en Javascript sont souvent peu fiables car l'objet Date est limité à des millisecondes et ne fournit généralement pas une précision suffisante pour des résultats utiles.

Enfin, toutes choses étant égales par ailleurs, une recherche d'objet est jamais plus rapide qu'une instruction if/else ou switch, et pourrait en fait être plus lente de plusieurs ordres de grandeur. De même, la différence entre if/else et switch devrait être négligeable si elle existe, et dépend bien sûr fortement du navigateur/interprète spécifique.

+0

Merci à tous. Quelques autres notes de deux autres tests, l'un avec un ensemble plus petit, et l'autre où la condition de vérité existe pour le tout premier cas. Dans le plus petit ensemble, les résultats sont restés les mêmes, sauf pour Firefox, qui était soudainement beaucoup plus rapide avec switch(). Quand je cherchais le tout premier résultat ('a' au lieu de 'g'), les changements étaient plus rapides sur tous les navigateurs, mais l'évaluation paresseuse était la plus lente des techniques de hachage (Il semble que la deuxième recherche de hash soit la plus rapide w/petits ensembles): (1) http://jsperf.com/simpler-conditional-test; (2) http://jsperf.com/simpler-conditional-test-first-case –

Questions connexes