Comment connaitre le temp d'éxécution d'une boucle en C++ ?

Comment connaitre le temp d'éxécution d'une boucle en C++ ? - Programmation

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

Reply

Marsh Posté le 25-03-2001 à 17:59:02   

Reply

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.

Reply

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 :)

Reply

Marsh Posté le 25-03-2001 à 18:20:46    

C'est pas comme ça que tout le monde fait ? :D

Reply

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...

Reply

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 */
  ...
}

Reply

Marsh Posté le 27-03-2001 à 09:32:31    

Merci pour vos réponses.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed