Comment connaitre le temp d'éxécution d'une boucle en C++ ? - Programmation
Marsh Posté le 25-03-2001 à 18:16:41
Tu peux utiliser une fois l'appel clock AVANT d'entrer dans la boucle et une fois APRES la boucle, puis faire la différence.
Marsh Posté le 25-03-2001 à 18:19:38
Verdoux a écrit a écrit : Tu peux utiliser une fois l'appel clock AVANT d'entrer dans la boucle et une fois APRES la boucle, puis faire la différence. |
ouah la grosse astuce
Marsh Posté le 27-03-2001 à 02:30:22
Verdoux> Si, bien sûr.
Attention, si tu es sur PC avec un OS Microsoft (sauf Windows NT et Windows 2000), et que ta boucle est rapide, tu risques d'avoir des surprises en voyant le temps écoulé : 0 millisecondes, ou, de temps en temps, 55 millisecondes. En tout cas, toujours un multiple de 55 millisecondes.
C'est parce que, pour des raisons historiques, l'horloge du PC (sous DOS) est modifiée 18,2 fois (environ) par seconde, et la résolution de clock() est donc celle-là. Windows NT et UNIX n'ont évidemment pas ce problème.
Comment faire dans ce cas ? C'est simple, répéter l'opération n fois, avec n suffisamment grand pour obtenir la précision souhaitée (en général, une précision de l'ordre du pourcent ou de quelques pourmilles est largement suffisante).
Personnellement, je travaille actuellement sur des opérations qui durent quelques centaines de nanosecondes. Résultat, pour obtenir une précision suffisante dans la mesure du temps d'exécution, je suis obligé de les répéter 10 millions de fois...
Marsh Posté le 27-03-2001 à 05:24:38
Bonjour à toutes et à tous,
Pour les Pentiums, il y a une instruction assembleur (rdtsc) qui permet de récupérer la valeur d'un compteur interne sur 64 bits qui est incrémenté à la fréquence du CPU.
Il est donc possible de l'utiliser pour faire des mesures très précises.
Voici, ci-dessous, un exemple de programme en Visual C++ 6.0.
Bien sûr, il est possible d'ajouter au début une fonction qui détermine automatiquement la fréquence du CPU …
Salutations
----------------------------------
#define CPUFREQ 450000000.0 /* Mettre Ici la fréquence du CPU */
/* Recupération du compteur interne sur 64 bits */
void RDTSC(v)
DWORD *v;
{
_asm
{
push eax
push ebx
push ecx
push edx
mov ebx,v
mov ecx,0
rdtsc /* codes : 0x0F 0x31 */
mov [ebx+0],eax
mov [ebx+4],edx
pop edx
pop ecx
pop ebx
pop eax
}
}
main()
{
_int64 t0,t1,tajust; /* Entiers sur 64 bits */
double t;
RDTSC(&t0);
RDTSC(&t0);
RDTSC(&t1);
tajust=t1-t0;
RDTSC(&t0);
/* code a mesurer */
...
RDTSC(&t1);
t=(t1-t0-tajust)/(double)CPUFREQ; /* t en s, t1-t0-tajust en cycles cpu */
...
}
Marsh Posté le 25-03-2001 à 17:59:02
Dans mon programme, il y a un tri (une boucle) or j'aimerais savoir comment connaitre le temps que l'ordinateur à mis pour l'éffectuer.
Il y a la fonction clock, mais dans mon cas, elle me donne le temps écoulé depuis le lancement du programme ce qui me sert à rien.
J'utilise Borland C++ Builder 5.
Merci