Calculer le temps d'execution

Calculer le temps d'execution - C - Programmation

Marsh Posté le 25-05-2009 à 22:48:35    

Bonjour,  
Je voudrais calculer le temps d'execution, des differents algos de tri, en cherchant un peu comment marquer le temps, j'ai trouvé dans une source, time(0) dont la valeur est affectée à une variable entière, quelques secondes plutard, la valeur de retour de time(0) est affectée à une deuxième variable, end, par exemple, sauf que le temps n'a pas changé depuis, bien que des secondes se sont écoulés, vous auriez pas d'autres méthodes, pour calculer le temps d'execution d'une partie du code, à l'échelle des milisecondes ?
Merci d'avance

Reply

Marsh Posté le 25-05-2009 à 22:48:35   

Reply

Marsh Posté le 25-05-2009 à 23:00:50    

Pourquoi ne pas utiliser du profiling pour faire ça ?
Par exemple -gprof avec gcc ?


Message édité par Elmoricq le 25-05-2009 à 23:01:21
Reply

Marsh Posté le 25-05-2009 à 23:01:41    

sinon gettimeofday ou QueryPerformanceCounter

Reply

Marsh Posté le 26-05-2009 à 10:31:15    

times(2) / getrusage(2)

Reply

Marsh Posté le 30-05-2009 à 13:30:12    

Finalement j'ai opté pour clock();
 

Code :
  1. #include<time.h>
  2. #include<stdio.h>
  3.  
  4. int main(void)
  5. {
  6.  clock_t ticks1, ticks2;
  7.  
  8.  ticks1=clock();
  9.  ticks2=ticks1;
  10.  while((ticks2/CLOCKS_PER_SEC-ticks1/CLOCKS_PER_SEC)<1)
  11.    ticks2=clock();
  12.  
  13.  printf("Took %ld ticks to wait one second.\n",ticks2-ticks1);
  14.  printf("This value should be the same as CLOCKS_PER_SEC which is %ld.\n",CLOCKS_PER_SEC);
  15.  return 0;
  16. }


suffisait de connaître le nombre de ticks/clocks par seconde
après diviser par CLOCKS_PER_SEC si l'on veut en secondes,
ou encore enlever 3 zéros de la constante, pour passer en ms, 10^-3 !
 
Si quelqu'un tombe sur la page, on sait jamais :)

Reply

Marsh Posté le 30-05-2009 à 14:10:08    

clock c'ets juste atroce en terme de précision ...  
ensuite ta méthode est foireuse :
- une division ca suffit pas besoind 'en fiare 2
- diviser par double(CLOCKS_PER_SEC) me parait meilleur ...

Reply

Marsh Posté le 30-05-2009 à 20:13:12    

Code :
  1. start = clock();
  2. selection(nombres,N);
  3. end = clock();
  4. printf("Tableau trié en %ld ms \n",(end-start)/1000);


avec clock_t comme type pour start et end !
et ça marche hyper bien pour moi ...
 

Reply

Marsh Posté le 31-05-2009 à 07:51:30    

mesure un truc qui dure 0,01ms et on en reparle

Reply

Marsh Posté le 31-05-2009 à 12:40:29    

lol, oui, comme y'a %ld, donc entier et non relatif, même un 0,1 ms n'apparaitera pas, mais bon, ça me va bien comme ça.

Reply

Marsh Posté le 01-06-2009 à 10:31:37    

Joel F a écrit :

sinon gettimeofday

 

Tention avec gettimeofday, certaines implémentations ont une résolution de l'ordre du tick (10ms sur la plupart des systèmes, sauf à bidouiller le HZ), même si l'horloge est annoncée comme ayant une précision de la microseconde (ce qui est vrai). :)

 

J'en ai fait les frais sous un Linusque :/

 

Donc +1 pour QueryPerformanceCoutner sous win32, ou les différentes clocks fournies par le système via POSIX (on obtient la résolution par clock_getres).

 

Edit: ah et aussi, gettimeofday() est affectée par la synchro du temps système (adjtime), donc elle peut accélérer ou ralentir sur certains intervalles.

Message cité 1 fois
Message édité par Gf4x3443 le 01-06-2009 à 10:35:46

---------------
Petit guide Kerberos pour l'administrateur pressé
Reply

Marsh Posté le 01-06-2009 à 10:31:37   

Reply

Marsh Posté le 01-06-2009 à 13:02:23    

gettimeofday à part mesurer le temps qui passe, ça ne te diras jamais combien toi tu as à consommé.

Reply

Marsh Posté le 01-06-2009 à 13:07:44    

Gf4x3443 a écrit :


Tention avec gettimeofday, certaines implémentations ont une résolution de l'ordre du tick (10ms sur la plupart des systèmes, sauf à bidouiller le HZ), même si l'horloge est annoncée comme ayant une précision de la microseconde (ce qui est vrai). :)
 
J'en ai fait les frais sous un Linusque :/
 
Donc +1 pour QueryPerformanceCoutner sous win32, ou les différentes clocks fournies par le système via POSIX (on obtient la résolution par clock_getres).


 
Certes. Les clock POSIX j'ai trjrs eu du mal a en faire qq chose :/

Reply

Marsh Posté le 01-06-2009 à 15:01:18    

J'ai pas aimé l'API perso, du temps ou je devais faire des calculs de performances. Suivant les OS, ils n'ont pas les mêmes compteurs, et on bourre son code de #ifdef SunOS, #ifdef Linux, #ifdef BSD...

 

Le seul avantage que je lui trouve, c'est de pouvoir compter facilement le temps (on l'obtient direct depuis la struct), alors que les PerformanceCounter de win32 travaillent en fréquence et en nombre de ticks. C'est moins "naturel" quand on veut mesurer des intervalles.


Message édité par Gf4x3443 le 01-06-2009 à 15:01:42

---------------
Petit guide Kerberos pour l'administrateur pressé
Reply

Sujets relatifs:

Leave a Replay

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