Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2411 connectés 

 


Dernière réponse
Sujet : Comment connaitre le temp d'éxécution d'une boucle en C++ ?
LMF Merci pour vos réponses.

Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
LMF Merci pour vos réponses.
tfj57 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 */
  ...
}
BifaceMcLeOD 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...
verdoux C'est pas comme ça que tout le monde fait ? :D
line

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

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

Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)