Comment mesurer le temps d'exécution du code javascript avec des rappels
J'ai un morceau de code javascript que je suis de l'exécution à l'aide de la node.js interprète.
for(var i = 1; i < LIMIT; i++){
db.users.save({id : i, name : "MongoUser [" + i + "]"}, function(err, saved) {
if( err || !saved ) console.log("Error");
else console.log("Saved");
});
}
Je veux savoir comment mesurer le temps pris par ces db opérations d'insertion. J'ai pu calculer la différence de valeurs de Date avant et après ce morceau de code, mais ce serait incorrect en raison de la nature asynchrone de la code.
- Il suffit de lire le début de temps avant la db appel, et la fin des temps à l'INTÉRIEUR de la fonction de rappel..
- Il est possible que le temps que la DB finitions de l'insert et le temps que le rappel est exécuté n'est pas la même et cela introduit une erreur de mesure ?
- Non, vous ne devriez pas vous inquiéter à ce sujet, si la db code de la bibliothèque est bien conçu et ne pas manipuler de toute autre opération avant le déclenchement de la fonction de rappel, vous devriez obtenir une bonne mesure. Vous pouvez également le profil de l'insertion par mettre le timestamp à l'intérieur de la bibliothèque de code où l'insert est effectivement réalisé, au lieu de votre propre, mais, encore une fois, je ne serais pas s'inquiéter à ce sujet
- Je recommanderais d'essayer NodeTime qui semble être un bon ajustement pour ce que vous essayez de faire.
- J'ai écrit
timerlog
qui est similaire àconsole.time()
mais avec des fonctionnalités supplémentaires; github.com/brillout/timerlog
Vous devez vous connecter pour publier un commentaire.
Utiliser le Node.js
de la console.time()
etde la console.timeEnd()
:debug
?Il y a une méthode qui est conçu pour cela. Découvrez processus.hrtime(); .
Donc, en gros, j'ai mis en haut de mon application.
Puis-je l'utiliser pour voir combien de temps prise de fonctions. Voici un exemple de base qui imprime le contenu d'un fichier texte appelé "output.txt":
Voici un petit test que vous pouvez exécuter dans un terminal (shell BASH):
process.hrtime(start)
deux fois? Est-il une raison particulière à cela?Invoquant
console.time('label')
va enregistrer l'heure actuelle en millisecondes, puis, plus tard, l'appel deconsole.timeEnd('label')
affiche la durée à partir de ce point.Le temps en millisecondes sera automatiquement imprimé à côté de l'étiquette, de sorte que vous n'avez pas à faire un appel séparé à la console.journal pour imprimer une étiquette:
Pour plus d'informations, voir Mozilla developer docs sur
de la console.temps
.Pour quiconque veut obtenir le temps écoulé de la valeur plutôt que de la sortie de la console :
utilisation processus.hrtime() comme @D. Deriso suggestion, ci-dessous mon approche la plus simple :
var start = process.hrtime(); ... var end = process.hrtime(start);
à haute résolution en temps (si j'ai besoin d'attendre sous une précision à la milliseconde)Surpris que personne n'avait encore parlé de la nouvelle construction dans les bibliothèques:
Disponible en Nœud >= 8.5, et devrait être Moderne Browers
https://developer.mozilla.org/en-US/docs/Web/API/Performance
https://nodejs.org/docs/latest-v8.x/api/perf_hooks.html#
Nœud de 8,5 ~ 9.x (Firefox, Chrome)
JS:
https://repl.it/@CodyGeisler/NodeJsPerformanceHooks
Nœud 10.x
https://nodejs.org/docs/latest-v10.x/api/perf_hooks.html
TypeError: performance.getEntriesByName is not a function
Nœud v10.4.1Stability: 1 - Experimental
peut-être? 🙂 nodejs.org/docs/latest-v8.x/api/...Une vieille question, mais pour une simple API et de la lumière-poids de la solution; vous pouvez utiliser perfy qui utilise de haute résolution en temps réel (
process.hrtime
) en interne.Notez que chaque fois
perfy.end(label)
est appelée, cette instance est auto-détruit.La divulgation: a Écrit ce module, inspiré par D. Deriso réponse. Docs ici.
Vous pourriez donner Benchmark.js un essai. Il prend en charge de nombreuses plates-formes parmi eux également node.js.
Vous pouvez également essayer de exectimer. Il vous donne des commentaires comme:
[modifier] Il y a même un moyen plus simple pour utiliser exectimer parce que maintenant il peut encapsuler le code pour être mesurée. Votre code pourrait enveloppé comme ceci:
J'ai eu le même problème tout en se déplaçant d'AWS pour Azure
Pour express & aws, vous pouvez déjà utiliser, de temps existant() et timeEnd()
Pour Azure, utilisez ceci:
https://github.com/manoharreddyporeddy/my-nodejs-notes/blob/master/performance_timers_helper_nodejs_azure_aws.js
Ces temps() et timeEnd() utiliser la hrtime fonction de (), qui donnent à haute résolution en temps réel.
Espère que cette aide.
Et une autre option est d'utiliser le express-debug outil:
Il bénéficie d'un profilage: panneau de
Aussi. à ajouter aux réponses ci-dessus, vous pouvez vérifier cette réponse pour permettre à tout le profilage de code pour l'environnement de développement uniquement.