Comment mesurez-vous le temps d'une fonction nécessaire à l'exécution?
Comment pouvez-vous mesurer la quantité de temps une fonction à exécuter?
Ce qui est relativement court de la fonction et le temps d'exécution serait probablement de l'ordre de la milliseconde.
Cette question se rapporte à un système embarqué, programmé en C ou C++.
quelle langue?
Je ne crois pas en matière linguistique en soi. Ce n'est plus un HW question.
Je ne crois pas en matière linguistique en soi. Ce n'est plus un HW question.
OriginalL'auteur Benoit | 2008-09-16
Vous devez vous connecter pour publier un commentaire.
La meilleure façon de le faire que sur un système embarqué est de définir un périphérique externe pin lorsque vous entrez dans la fonction et de la désactiver lorsque vous quittez la fonction. Cela se fait de préférence avec un peu d'instructions de montage afin de ne pas fausser vos résultats trop.
Edit: l'Un des avantages est que vous pouvez le faire dans votre application et que vous n'avez pas besoin d'un code de test. Externe de débogage broches sont (devraient être!) pratique standard pour tous les systèmes embarqués.
"À portée de main avec le matériel" est "incorporé" dans le cadre "le Développement des Logiciels Embarqués". Qui mieux être une hypothèse sûre. 🙂
Linux embarqué...dois-je en dire plus?
OriginalL'auteur cschol
Il y a trois solutions possibles:
Solution Matérielle:
Utiliser gratuitement la broche de sortie du processeur et du crochet un oscilloscope ou un analyseur logique à la broche. Initialisation de la broche à l'état bas, juste avant l'appel de la fonction que vous voulez mesurer, affirmer la broche à l'état haut et juste après le retour de la fonction, désactivons le pin.
Bookworm solution:
Si la fonction est assez petite, et vous pouvez gérer le code désassemblé, vous pouvez ouvrir le processeur de l'architecture databook et de compter les cycles qu'il faudra le processeur à exécuter toutes les instructions. Cela vous donnera le nombre de cycles requis.
Temps = # cycles * fréquence d'Horloge du Processeur /tops d'Horloge par les instructions
C'est plus facile à faire pour les petites fonctions, ou d'un code écrit en assembleur (pour un microcontrôleur PIC par exemple)
Timestamp solution de comptoir:
Certains processeurs ont un horodatage compteur qui s'incrémente à un rythme rapide (quelques processeur tops d'horloge). Il suffit de lire le timestamp avant et après la fonction.
Cela vous donnera le temps écoulé, mais méfiez-vous de ce que vous pourriez avoir à traiter avec le compteur de roulement.
OriginalL'auteur Benoit
L'invoquer dans une boucle avec une tonne d'invocations, puis diviser par le nombre d'invocations pour obtenir le temps moyen.
donc:
Le seul problème est, vous avez également à rendre compte de la boucle de surcharge si vous êtes sérieux au sujet d'obtenir une synchronisation précise.
Boucle frais généraux sont assez minimes, pour compenser pour cela, il vous suffit d'un temps vide de la boucle et puis soustrayez-temps à partir de la fonction de temps.
OriginalL'auteur Mike Stone
si vous utilisez linux, vous pouvez de temps à un programme d'exécution en tapant dans la ligne de commande:
si vous exécutez seulement la fonction main() (en supposant que C++), le reste de l'application devrait être négligeable.
OriginalL'auteur Joe Fontana
Je le répète, l'appel de la fonction d'un grand nombre de fois (en millions de dollars), mais également employer la méthode suivante à la remise de la boucle généraux:
Au lieu d'appeler la fonction() deux fois dans la première boucle et une fois dans la seconde boucle, vous pouvez simplement appeler une fois dans la première boucle et de ne pas l'appeler du tout (c'est à dire vide de la boucle) dans la seconde, cependant le vide boucle peut être optimisé par le compilateur, vous donnant négatif calendrier résultats 🙂
OriginalL'auteur Ates Goral
OriginalL'auteur Galen
Windows XP/NT Embedded ou Windows CE/Mobile
Vous utilisez le QueryPerformanceCounter() pour obtenir la valeur d'un TRÈS RAPIDE compteur avant et après votre fonction. Alors vous soustraire ces 64-bits de valeurs et d'obtenir un delta "tiques". À l'aide de QueryPerformanceCounterFrequency (), vous pouvez convertir le "delta tiques" à une unité de temps. Vous pouvez vous référer à la documentation MSDN au sujet de ces appels WIN32.
D'autres systèmes embarqués
Sans systèmes d'exploitation ou uniquement avec de base des Systèmes d'exploitation, vous aurez à:
TRÈS IMPORTANT Ne pas oublier de le désactiver avant et restaurer des interruptions après l'obtention de ces valeurs du chronomètre (bot la transporter et de la valeur de registre) sinon vous risquez d'enregistrement des valeurs incorrectes.
NOTES
OriginalL'auteur Philibert Perusse
Dépend de votre plate-forme embarquée et ce type de calendrier que vous recherchez. Pour Linux embarqué, il y a plusieurs façons que vous pouvez accomplir. Si vous souhaitez mesurer la quantité de temps CPU utilisé par votre fonction, vous pouvez effectuer les opérations suivantes:
Vous aurez besoin de faire le lien avec le temps réel de la bibliothèque, il suffit d'utiliser ceux-ci pour compiler votre code:
Vous pouvez également lire la page de man
clock_gettime
il y a quelques problèmes avec l'exécution de ce code sur les systèmes SMP de ce système qui pourrait invalider vous tests. Vous pouvez utiliser quelque chose commesched_setaffinity()
ou la ligne de commandecpuset
pour forcer le code sur un seul core.Si vous êtes à la recherche pour mesurer l'utilisateur et du système de temps, alors vous pouvez utiliser les
times(NULL)
qui renvoie à quelque chose comme un jiffies. Ou vous pouvez modifier le paramètre declock_gettime()
deCLOCK_THREAD_CPUTIME_ID
àCLOCK_MONOTONIC
...mais attention de reboucler avecCLOCK_MONOTONIC
.Pour d'autres plates-formes, vous êtes sur votre propre.
A attiré
OriginalL'auteur Drew Frezell
J'ai toujours mettre en œuvre une interruption ticker de la routine. Puis à ce que les mises à jour d'un compteur qui compte le nombre de millisecondes écoulées depuis le démarrage. Ce compteur est alors accessible avec un GetTickCount() fonction.
Exemple:
Dans votre code, vous temps le code comme suit:
selwyn, avez-vous l'intention d'écrire
printf("Time is %ld", GetTickCount() - time);
? Question de Noob mais qu'en débordement de la tickCounter?OriginalL'auteur selwyn
Dans OS X terminal (et probablement Unix), utiliser le "temps":
OriginalL'auteur stalepretzel
Si le code est .Net, utilisez le chronomètre (de la classe.net 2.0+) PAS de type DateTime.Maintenant. DateTime.Maintenant n'est pas mis à jour de manière suffisamment précise et vous donnera fou résultats
OriginalL'auteur
Si vous êtes à la recherche pour les sous-milliseconde, essayez l'une de ces délais méthodes. Tous les vous de résolution, au moins dans les quelques dizaines ou centaines de microsecondes:
Si c'est Linux embarqué, regardez Linux minuteries:
http://linux.die.net/man/3/clock_gettime
Embedded Java, regardez nanoTime(), bien que je ne suis pas sûr que ce soit dans l'édition intégrée:
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/System.html#nanoTime()
Si vous voulez obtenir les compteurs de matériel, essayez de PAPI:
http://icl.cs.utk.edu/papi/
Sinon vous pouvez toujours aller à l'assembleur. Vous pouvez consulter le PAPI source pour votre architecture si vous avez besoin d'aide avec ce.
OriginalL'auteur Todd Gamblin