J'ai besoin d'obtenir le temps d'exécution en millisecondes.
J'ai initialement posé cette question en 2008. La réponse acceptée était alors d'utiliser la nouvelle Date (). GetTime () Cependant, nous pouvons tous convenir maintenant que l'utilisation de l' API standard performance.now () est plus appropriée. Je modifie donc la réponse acceptée à celle-ci.
javascript
profiling
Julius A
la source
la source
Date
manière classique , ce qui vous donnems
et est suffisant pour la majorité des cas je pense albertech.blogspot.com/2015/07/… ... mais oui, vous devriez vraiment regarderPerformance.now
performance.now()
ne fonctionne pas dans Node.new Date().getTime()
fonctionnera dans Node.Réponses:
Utilisation de performance.now () :
Utilisation de console.time :
(non standard)( niveau de vie )Remarque :
La chaîne transmise auxméthodes
time()
ettimeEnd()
doit correspondre(pour que la minuterie se termine comme prévu).
la source
utilisez new Date (). getTime ()
ex.
la source
window.performance.now
. Voir stackoverflow.com/a/15641427/632951N'utilisez pas Date (). Lire ci-dessous.
Utilisation
performance.now()
:Il fonctionne sur:
IE 10 ++
FireFox 15 ++
Chrome 24 ++
Safari 8 ++
Opera 15 ++
Android 4.4 ++
etc
console.time
peut être viable pour vous , mais ce n'est pas standard § :Outre la prise en charge du navigateur,
performance.now
semble avoir le potentiel de fournir des timings plus précis car il semble que ce soit la version simple deconsole.time
.<rant> Aussi, NE JAMAIS utiliser
Date
pour quoi que ce soit car il est affecté par les changements de "l'heure système". Ce qui signifie que nous allons obtenir des résultats invalides -comme « timing négatif » - lorsque l'utilisateur ne dispose pas d' un temps de système précis:(Réglez votre horloge système sur un an et accédez à Gmail pour que nous puissions tous bien rire. Peut-être qu'un jour nous aurons un Hall of Shame pour JS
Date
.)La
now()
fonction de Google Spreadsheet souffre également de ce problème.La seule fois que vous utiliserez,
Date
c'est quand vous voulez montrer à l'utilisateur l' heure de son horloge système. Pas quand vous voulez avoir le temps ou mesurer quoi que ce soit.la source
Si vous devez obtenir le temps d'exécution de la fonction sur votre machine de développement locale , vous pouvez utiliser les outils de profilage de votre navigateur ou des commandes de console telles que
console.time()
etconsole.timeEnd()
.Tous les navigateurs modernes ont des profileurs JavaScript intégrés. Ces profileurs devraient donner la mesure la plus précise car vous n'avez pas à modifier votre code existant, ce qui pourrait affecter le temps d'exécution de la fonction.
Pour profiler votre JavaScript:
Alternativement, sur votre machine de développement , vous pouvez ajouter une instrumentation à votre code avec
console.time()
etconsole.timeEnd()
. Ces fonctions, prises en charge dans Firefox11 +, Chrome2 + et IE11 +, rendent compte des minuteries via lesquelles vous démarrez / arrêtezconsole.time()
.time()
prend comme argument un nom de temporisateur défini par l'utilisateur,timeEnd()
puis rend compte du temps d'exécution depuis le démarrage du temporisateur:Notez que seul Firefox renvoie le temps écoulé dans l'
timeEnd()
appel. Les autres navigateurs signalent simplement le résultat à la console développeur: la valeur de retour detimeEnd()
n'est pas définie.Si vous souhaitez obtenir le temps d'exécution de la fonction dans la nature , vous devrez instrumenter votre code. Vous avez plusieurs options. Vous pouvez simplement enregistrer les heures de début et de fin en interrogeant
new Date().getTime()
:Cependant, l'
Date
objet n'a qu'une résolution en millisecondes et sera affecté par les modifications d'horloge système de tout système d'exploitation. Dans les navigateurs modernes, il existe une meilleure option.La meilleure option est d'utiliser le temps de haute résolution , alias
window.performance.now()
.now()
est meilleur que le traditionnelDate.getTime()
de deux manières importantes:now()
est un double avec une résolution submilliseconde qui représente le nombre de millisecondes depuis le début de la navigation de la page. Il renvoie le nombre de microsecondes dans le fractionnaire (par exemple, une valeur de 1000.123 est de 1 seconde et 123 microsecondes).now()
augmente de façon monotone. Ceci est important car ilDate.getTime()
peut éventuellement avancer ou même reculer lors des appels suivants. Notamment, si l'heure système du système d'exploitation est mise à jour (par exemple la synchronisation de l'horloge atomique),Date.getTime()
est également mise à jour.now()
est garanti d'être toujours en augmentation monotone, il n'est donc pas affecté par l'heure système du système d'exploitation - ce sera toujours l'heure de l'horloge murale (en supposant que votre horloge murale n'est pas atomique ...).now()
peut être utilisé dans presque tous les endroits quinew Date().getTime()
,+ new Date
ettDate.now()
sont. L'exception est queDate
et lesnow()
temps ne se mélangent pas, commeDate
se base sur unix-époque (le nombre de millisecondes depuis 1970), alors quenow()
le nombre de millisecondes depuis votre page de navigation a commencé (il sera beaucoup plus petit queDate
).Voici un exemple d'utilisation
now()
:now()
est pris en charge dans Chrome stable, Firefox 15+ et IE10. Il existe également plusieurs polyfills disponibles.UserTiming est une autre option pour mesurer le temps d'exécution dans la nature . UserTiming se comporte de la même manière que
console.time()
etconsole.timeEnd()
, mais il utilise le même horodatage haute résolution que celuinow()
utilisé (vous obtenez donc une horloge augmentant de façon monotone de moins d'une milliseconde) et enregistre les horodatages et les durées dans PerformanceTimeline .UserTiming a les concepts de marques (horodatages) et de mesures (durées). Vous pouvez en définir autant que vous le souhaitez, et ils sont exposés sur PerformanceTimeline .
Pour enregistrer un horodatage, vous appelez
mark(startMarkName)
. Pour obtenir la durée depuis votre première note, il vous suffit d'appelermeasure(measurename, startMarkname)
. La durée est ensuite enregistrée dans PerformanceTimeline à côté de vos repères.UserTiming est disponible dans IE10 + et Chrome25 +. Il existe également un polyfill disponible (que j'ai écrit).
la source
performance.now
etDate
c'est la raison pour laquelle ils existent.Pour obtenir des valeurs précises, vous devez utiliser l' interface Performance . Il est pris en charge dans les versions modernes de Firefox, Chrome, Opera et IE. Voici un exemple de la façon dont il peut être utilisé:
Date.getTime()
ouconsole.time()
ne sont pas bons pour mesurer un temps d'exécution précis. Vous pouvez les utiliser si une estimation rapide et approximative vous convient. Par estimation approximative, je veux dire que vous pouvez obtenir un décalage de 15 à 60 ms par rapport au temps réel.Vérifiez ce brillant après sur la mesure du temps d'exécution en JavaScript. L'auteur donne également quelques liens sur la précision de l'heure JavaScript, à lire.
la source
Utilisez Firebug, activez la console et Javascript. Cliquez sur Profil. Recharger. Cliquez à nouveau sur Profil. Consultez le rapport.
la source
console.time()
etconsole.timeEnd()
aussi maintenant.Référence
Production
performance.now () est facultatif - passez simplement false dans la fonction constructeur StopWatch.
la source
process.hrtime () est disponible dans Node.js - il retourne une valeur en nanosecondes
la source
hrtime[0] * 1000 + hrtime[1] / 1000000
-> ouais, j'utilise plutôtvar hrtime
aussi! : Pvous pouvez également utiliser l'opérateur d'ajout ici
la source
Pour étendre davantage le code de vsync pour avoir la possibilité de renvoyer le timeEnd en tant que valeur dans NodeJS, utilisez ce petit morceau de code.
Maintenant, utilisez le code comme ceci:
Cela vous donne plus de possibilités. Vous pouvez stocker le temps d'exécution pour être utilisé à d'autres fins, comme l'utiliser dans des équations, ou stocké dans une base de données, envoyé à un client distant via des sockets Web, servi sur une page Web, etc.
la source
Il est possible d'utiliser une seule variable:
timer/1000
- pour convertir des millisecondes en secondes.toFixed(5)
- pour couper des chiffres supplémentairesla source
Depuis
console.time
etperformance.now
ne sont pas pris en charge dans certains principaux navigateurs (ie IE10), j'ai créé un utilitaire slim qui utilise les meilleures méthodes disponibles. Cependant, il manque de gestion des erreurs pour les fausses utilisations (appelEnd()
à un temporisateur non initialisé).Utilisez-le et améliorez-le comme vous le souhaitez.
la source
Cela peut vous aider.
var t0 = date.now(); doSomething(); var t1 = date.now(); console.log("Call to doSomething took approximate" + (t1 - t0)/1000 + " seconds.")
la source
Voici un décorateur pour les fonctions de synchronisation
Usage:
Si vous utilisez des fonctions asynchrones, vous pouvez faire de l'
timed
async et ajouter unawait
avant f (... args), et cela devrait fonctionner pour celles-ci. Cela devient plus compliqué si vous voulez qu'un décorateur gère les fonctions de synchronisation et d'async.la source
Merci, Achim Koellner, développera un peu votre réponse:
Veuillez noter que vous ne devez rien faire à part ce que vous voulez mesurer (par exemple,
console.log
prendra également du temps à exécuter et affectera les tests de performances).Notez que dans l'ordre par mesure du temps d'exécution des fonctions asynchrones, vous devez insérer
var timeInMilliseconds = process.hrtime(t0)[1]/1000000;
à l'intérieur du rappel. Par exemple,la source
Il y a quelques mois, j'ai créé ma propre routine qui chronomètre une fonction en utilisant Date.now () - même si à l'époque la méthode acceptée semblait être performance.now () - parce que l'objet de performance n'est pas encore disponible (construit -in) dans la version stable de Node.js.
Aujourd'hui, je faisais plus de recherches et j'ai trouvé une autre méthode de chronométrage. Puisque j'ai également trouvé comment utiliser cela dans le code Node.js, j'ai pensé que je le partagerais ici.
Les éléments suivants sont combinés à partir des exemples donnés par w3c et Node.js :
REMARQUE:
Si vous avez l'intention d'utiliser l'
performance
objet dans une application Node.js, vous devez inclure les éléments suivants:const { performance } = require('perf_hooks')
la source
performance.mark('end')
dans ce casil existe plusieurs façons d'atteindre cet objectif:
en utilisant console.time
c'est le moyen le plus efficace: utiliser performance.now () , par exemple
utilisez + (ajouter un opérateur) ou getTime ()
Voici ce qui se passe lorsque vous appliquez l'opérateur unaire plus à une instance de date: Obtenez la valeur de l'instance de date en question Convertissez-la en nombre
REMARQUE:
getTime()
donne de meilleures performances que l'opérateur unaire +.la source
InitTime lié à
string
.return Singleton.getInstance().initTime(label); // Returns the time init
return Singleton.getInstance().endTime(label); // Returns the total time between init and end
la source
Si vous voulez mesurer le temps entre plusieurs choses qui ne sont pas imbriquées, vous pouvez utiliser ceci:
Similaire à console.time (), mais une utilisation plus facile si vous n'avez pas besoin de garder une trace des minuteries précédentes.
Si vous aimez la couleur bleue de console.time (), vous pouvez utiliser cette ligne à la place
la source
Dans mon cas, je préfère utiliser @ grammar suger et le compiler avec babel.
Le problème de cette méthode est que la fonction doit être à l'intérieur de l'objet.
Exemple de code JS
.babelrc (pour babel 6)
la source
Chronomètre avec cycles cumulatifs
Fonctionne avec serveur et client (Node ou DOM), utilise l'
Performance
API. Bien lorsque vous avez de nombreux petits cycles, par exemple dans une fonction appelée 1000 fois qui traite 1000 objets de données, mais que vous voulez voir comment chaque opération dans cette fonction s'ajoute au total.Donc celui-ci utilise une minuterie globale (singleton) de module. Identique à un modèle de classe singleton, juste un peu plus simple à utiliser, mais vous devez le mettre dans un
stopwatch.js
fichier eg séparé .la source
La meilleure façon serait d'utiliser le
performance hooks
module. Bien instable, vous pouvez lesmark
zones spécifiques de votre code etmeasure
lesduration
entre les zones marquées.Essayez ici
la source
la source
Avec performance
NodeJs: il est nécessaire d'importer la classe de performances
Utilisation de console.time
la source
console.time("myTimer");
console.timeLog("myTimer");
console.timeEnd("myTimer");
Vous pouvez en savoir plus à ce sujet sur MDN et dans la documentation Node.js .
Disponible sur Chrome, Firefox, Opera et NodeJS. (pas sur Edge ou Internet Explorer).
la source
Comme indiqué précédemment, vérifiez et utilisez la minuterie intégrée. Mais si vous voulez ou devez écrire le vôtre, voici mes deux cents:
La compilation a été un succès!
la source
La réponse acceptée est fausse !
Puisque JavaScript est asynchrone, les valeurs de l'extrémité variable de la réponse acceptée seraient erronées.
L'exécution de for peut être très rapide, vous ne pouvez donc pas voir que le résultat est incorrect. Vous pouvez le tester avec un code faisant une requête:
L'alerte sera donc très rapide, mais dans la console, vous verrez que les requêtes ajax se poursuivent.
Voici comment vous devez le faire: https://developer.mozilla.org/en-US/docs/Web/API/Performance.now
la source