2009-11-30 10 views
2

Je suis la vitesse de tester certains programmes JavaScript en créant un objet Date, et en l'utilisant pour obtenir le temps en millisecondes avant et après le travail réel de la fonction. J'ai fait le corps un ajout simple pour la boucle, et puis la fin est en train de soustraire l'ancien ms du nouveau ms et d'imprimer cela. Cependant, tout se termine en 0 millisecondes ... ce qui est logique car le moment où je le vérifie avec une écriture est le même avant et après le travail. Est-ce que je le fais bien, et JavaScript (dans Chrome) est ultra rapide, ou est-ce qu'il y a des trucs dans les coulisses qui gâchent mes variables.Timing en JavaScript

+0

Vous aurez probablement besoin d'un peu de code, il est impossible de dire ce qui ne va pas autrement - ce que vous faites semble correct en principe – laura

+0

Il Il est plus facile de voir si vous faites quelque chose de mal si vous publiez le code auquel vous faites référence. – stpe

Répondre

5

Alors que l'objet Date renvoie des heures en millisecondes, il ne s'agit pas de la résolution du compteur. Par exemple, la minuterie peut cocher une fois toutes les 10 ms. Si votre processus ne prend que 3 ms, la plupart du temps vous ne verrez pas une mesure non nulle (et parfois vous verrez 10 ms).

La solution est d'exécuter votre fonction plusieurs fois, et de chronométrer le tout. Par exemple, exécutez-le un million de fois et divisez le temps total par 1000000 pour obtenir le temps moyen d'un cycle.

1

Nous aurions vraiment besoin de voir votre code. Quoi qu'il en soit, une raison possible du zéro est que votre boucle fonctionne de manière asynchrone: l'interpréteur n'attend pas la fin de la boucle avant de vous sauter l'instruction suivante. Ou, bien sûr, votre boucle peut être très rapide.

BTW, vous pourriez être intéressé par l'utilisation d'un profileur JavaScript. Firebug pour Firefox en a un bon. Vous avez juste besoin d'ouvrir la console et appuyez sur Profil.

+0

Firebug est un bon conseil. +1 –

2

Voir mes answer to this question pour savoir comment vous pourriez implémenter quelques comparaisons de benchmarks simples. Comme l'a souligné @Greg Hewgill, il est important d'exécuter le test plusieurs fois pour obtenir une représentation précise de la durée effective d'un test spécifique.

En général, cela se résume à quelque chose d'aussi simple que:

var MAX = 100000, i = 0, 
    s = null, e = null; 

console.info("`someMethodToTest()` over %d iterations", MAX); 
s = new Date(); 
do { 
    someMethodToTest(); 
} while (++i < MAX); 
e = new Date(); 

console.log("Total: %dms; average: %dms", +e - +s, (+e - +s)/MAX);