2012-12-19 3 views
7

En cherchant des façons d'optimiser mon code, je suis arrivé sur this jsPerf test. N'attendant rien d'autre que d'avoir réaffirmé ma notion de lenteur des appels de fonction, mes résultats avec IE 9 m'ont vraiment lancé pour une boucle. Le code qui a utilisé les appels de fonction était plus rapide, mais seulement sur ce navigateur. Je l'ai couru plusieurs fois avec le même résultat. Je ne peux pas voir que le test a été mal configuré. Qu'est-ce qui pourrait causer ce résultat étrange?IE fonctionne plus vite avec les appels de fonction?

Mon agent utilisateur est Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0 exécuté sur Windows Server 2008.

+0

Odd, IE 10 ne le fait pas non plus. – vcsjones

+0

Juste confirmé que c'est seulement une chose IE 9. Je l'ai essayé à nouveau sur un autre ordinateur. –

+1

L'onglet était-il en 32 bits ou 64 bits? Le débogage de script a-t-il été activé ou désactivé? Y at-il une différence si vous utilisez le * résultat * du test (par exemple en empêchant l'optimisation de la chose entière) – EricLaw

Répondre

4

Avertissement: Je suis le créateur de jsPerf.com.


Votre premier test est la suivante:

var i = 0; 
for (i = 0; i < 1000; i++) { 
    test() 
} 

Pourquoi inclure la boucle il for? Cela fausse seulement le résultat. jsPerf répète automatiquement le code de test jusqu'à ce qu'il ait effectué suffisamment de tests pour obtenir un résultat statistiquement significatif. Idéalement, les tests jsPerf sont aussi compacts que possible et ne testent que ce que vous voulez vraiment tester. Dans ce cas, vous n'êtes pas du tout intéressé par les performances de la boucle for - vous voulez juste savoir si le code inline est plus rapide que d'appeler une fonction ou non.

Si vous êtes intéressé par d'autres conseils sur la création de cas de test robustes jsPerf, check out my #jsconfeu2011 presentation.

Remarque: Je ne dis pas que la boucle for redondante est la raison pour laquelle vous voyez ce résultat. Cela pourrait être un facteur, mais il y a peut-être autre chose qui fausse davantage le résultat. Quoi qu'il en soit, j'ai bifurqué votre test jsPerf, j'ai supprimé les boucles et j'ai rendu les variables globales afin d'éviter les optimisations d'élimination de code mort. http://jsperf.com/function-calls-vs-inline/3 Pourriez-vous tester cela dans IE9? Je n'ai pas de VM IE9 à portée de main pour le moment.

+0

Je n'ai pas accès à ma machine avec IE9 en ce moment, mais peut-être encore plus bizarrement, Chrome fonctionne maintenant plus vite avec des appels de fonction. –

+0

@TreyKeown: Intéressant, je peux reproduire les résultats dans Chrome 28, mais pas dans Chrome 30 Canary. Cela a peut-être été un coup de chance dans la version v8 livrée avec Chrome 28. Quelque chose de similaire s'est produit il y a quelque temps - à un moment donné, effectuer une recherche de portée était plus rapide que _not_ effectuer une recherche de portée dans v8: http://jsperf.com/ recherche de portée –

Questions connexes