Existe-t-il un moyen de déterminer le temps nécessaire à une méthode pour s'exécuter (en millisecondes)?
222
Existe-t-il un moyen de déterminer le temps nécessaire à une méthode pour s'exécuter (en millisecondes)?
Réponses:
Rapide:
Swift3:
Facile à utiliser et d'une précision inférieure à la milliseconde.
la source
NSLog(@"executionTime = %f", executionTime);
NSDate
etmach_absolute_time()
à environ 30 ms. 27 contre 29, 36 contre 39, 43 contre 45.NSDate
était plus facile à utiliser pour moi et les résultats étaient suffisamment similaires pour ne pas dérangermach_absolute_time()
.Voici deux macros d'une ligne que j'utilise:
Utilisez-le comme ceci:
la source
#define TOCK NSLog(@"%s Time: %f", __func__, -[startTime timeIntervalSinceNow])
fait que cette réponse retourne également dans quelle fonction la minuterie a été utilisée. J'ai trouvé cela utile si j'utilisais le TICK TOCK pour chronométrer plusieurs fonctions.__PRETTY_FUNCTION__
et__LINE__
si vous souhaitez des informations plus détaillées.Pour un timing précis sur OS X, vous devez utiliser
mach_absolute_time( )
déclaré dans<mach/mach_time.h>
:Bien sûr, les mises en garde habituelles concernant les mesures à grain fin s'appliquent; il vaut probablement mieux invoquer la routine testée plusieurs fois et faire la moyenne / prendre un minimum / une autre forme de traitement.
De plus, veuillez noter qu'il peut être plus utile de profiler votre application en cours d'exécution à l'aide d'un outil comme Shark. Cela ne vous donnera pas d'informations précises sur le calendrier, mais cela vous indiquera quel pourcentage du temps de l'application est dépensé où, ce qui est souvent plus utile (mais pas toujours).
la source
Il y a un emballage pratique pour
mach_absolute_time()
- c'est uneCACurrentMediaTime()
fonction.ObjC
Rapide
la source
NSDate
.Dans Swift, j'utilise:
Dans mon Macros.swift, je viens d'ajouter
vous pouvez maintenant appeler n'importe où
la source
\(-startTime.timeIntervalSinceNow)
(remarquez le négatif)Je sais que c'est un ancien mais même je me suis retrouvé à le repasser, alors j'ai pensé soumettre ma propre option ici.
Le meilleur pari est de consulter mon article de blog à ce sujet: chronométrer les choses dans Objective-C: un chronomètre
Fondamentalement, j'ai écrit une classe qui arrête de regarder de manière très basique mais est encapsulée de sorte que vous n'avez qu'à faire ce qui suit:
Et vous vous retrouvez avec:
dans le journal ...
Encore une fois, consultez mon article pour un peu plus ou téléchargez-le ici: MMStopwatch.zip
la source
J'utilise des macros basées sur la solution de Ron .
Pour les lignes de code:
nous verrons dans la console quelque chose comme: TIME1: 0.096618
la source
J'utilise une implémentation de classe d'une page très minimale inspirée du code de ce blog :
Son utilisation est très simple:
[DBGStopwatch start:@"slow-operation"];
au début[DBGStopwatch stop:@"slow-operation"];
après l'arrivée, pour avoir le tempsla source
Vous pouvez obtenir un timing très fin (secondes, parties de secondes) en utilisant cette classe StopWatch. Il utilise la minuterie haute précision de l'iPhone. L'utilisation de NSDate n'obtiendra qu'une précision d'une seconde. Cette version est conçue spécifiquement pour autorelease et objective-c. J'ai également une version c ++ si nécessaire. Vous pouvez trouver la version c ++ ici .
StopWatch.h
StopWatch.m
La classe a une
stopWatch
méthode statique qui renvoie un objet libéré automatiquement.Une fois que vous appelez
start
, utilisez laseconds
méthode pour obtenir le temps écoulé. Appelez àstart
nouveau pour le redémarrer. Oustop
pour l'arrêter. Vous pouvez toujours lire l'heure (appelseconds
) à tout moment après l'appelstop
.Exemple dans une fonction (temporisation de l'exécution)
la source
J'utilise ce code:
la source
J'utilise ceci:
Mais je ne suis pas sûr de CLOCKS_PER_SEC sur l'iPhone. Vous voudrez peut-être le laisser de côté.
la source
Un exemple de synchronisation à grain fin utilisant
mach_absolute_time()
dans Swift 4:la source
OK, si votre objectif est de trouver ce que vous pouvez corriger pour le rendre plus rapide, c'est un objectif un peu différent. Mesurer le temps que prennent les fonctions est un bon moyen de savoir si ce que vous avez fait a fait une différence, mais pour savoir quoi faire, vous avez besoin d'une technique différente. C'est ce que je recommande , et je sais que vous pouvez le faire sur les iPhones.
Edit: Les critiques ont suggéré que j'élabore la réponse, donc j'essaie de penser à une brève façon de le dire.
Votre programme global prend suffisamment de temps pour vous déranger. Supposons que ce soit N secondes.
Vous supposez que vous pouvez l'accélérer. La seule façon de le faire est de ne pas faire ce qu'il fait pendant ce temps, ce qui représente m secondes.
Vous ne savez pas au départ ce que c'est. Vous pouvez deviner, comme le font tous les programmeurs, mais cela pourrait facilement être autre chose. Quoi que ce soit, voici comment le trouver:
Puisque cette chose, quelle qu'elle soit, représente la fraction m / N du temps, cela signifie que si vous la mettez en pause au hasard, la probabilité est m / N que vous l'attrapiez en train de faire cette chose. Bien sûr, il pourrait faire autre chose, mais faites une pause et voyez ce qu'il fait.
Maintenant recommence. Si vous le voyez refaire la même chose, vous pouvez être plus méfiant.
Faites-le 10 fois, ou 20. Maintenant, si vous le voyez faire quelque chose de particulier (peu importe comment vous le décrivez) sur plusieurs pauses, dont vous pouvez vous débarrasser, vous savez deux choses. Vous savez très approximativement quelle fraction de temps cela prend, mais vous savez très exactement quoi réparer.
Si vous voulez également savoir très exactement combien de temps vous économiserez, rien de plus simple. Mesurez-le avant, réparez-le et mesurez-le après. Si vous êtes vraiment déçu, annulez le correctif.
Voyez-vous en quoi cela diffère de la mesure? C'est trouver, pas mesurer . La plupart du profilage est basé sur la mesure aussi exacte que possible du temps nécessaire, comme si c'était important, et remet en question le problème de l'identification de ce qui doit être corrigé. Le profilage ne trouve pas tous les problèmes, mais cette méthode trouve tous les problèmes, et ce sont les problèmes que vous ne trouvez pas qui vous blessent.
la source
Voici une autre façon, dans Swift, de le faire en utilisant le mot clé defer
À partir des documents d'Apple : une instruction defer est utilisée pour exécuter du code juste avant de transférer le contrôle du programme en dehors de la portée dans laquelle l'instruction defer apparaît.
Ceci est similaire à un bloc try / finally avec l'avantage de regrouper le code associé.
la source
J'utilise ceci dans ma bibliothèque d'utils ( Swift 4.2 ):
... puis appelez une méthode comme:
... qui à son tour ressemble à ceci dans la console après avoir exécuté:
Pas aussi concis que TICK / TOCK ci-dessus, mais il est suffisamment clair pour voir ce qu'il fait et inclut automatiquement ce qui est chronométré (par fichier, ligne au début de la méthode et nom de la fonction). Évidemment, si je voulais plus de détails (par exemple, si je ne chronomètre pas seulement un appel de méthode comme c'est le cas d'habitude, mais plutôt que je chronomètre un bloc dans cette méthode), je peux ajouter le paramètre "name =" Foo "" sur l'init PrintTimer pour le nommer quelque chose en plus des valeurs par défaut.
la source
Puisque vous souhaitez optimiser le temps de passage d'une page à l'autre dans une UIWebView, cela ne signifie-t-il pas que vous cherchez vraiment à optimiser le Javascript utilisé pour charger ces pages?
À cette fin, je regarderais un profileur WebKit comme celui dont nous avons parlé ici:
http://www.alertdebugging.com/2009/04/29/building-a-better-javascript-profiler-with-webkit/
Une autre approche consisterait à commencer à un niveau élevé et à réfléchir à la manière de concevoir les pages Web en question afin de minimiser les temps de chargement à l'aide du chargement des pages de style AJAX au lieu de rafraîchir la vue Web entière à chaque fois.
la source
la source
Voici une solution Swift 3 pour bissecter du code n'importe où pour trouver un long processus.
Utilisation: -
Exemple de sortie: -
la source
de nombreuses réponses sont étranges et ne donnent pas vraiment de résultat en millisecondes (mais en quelques secondes ou autre):
voici ce que j'utilise pour obtenir MS (MILLISECONDS):
Rapide:
Objectif c:
la source
Pour Swift 4, ajoutez en tant que délégué à votre classe:
Ajoutez à notre classe:
Ajoutez ensuite à votre classe:
Lorsque vous voulez chronométrer quelque chose, commencez par:
Et terminez par:
la source