71 votes

Comment puis-je comparer le code C facilement?

Existe-t-il une simple bibliothèque permettant de mesurer le temps nécessaire pour exécuter une partie du code C? Ce que je veux c'est quelque chose comme:

 int main(){
    benchmarkBegin(0);
    //Do work
    double elapsedMS = benchmarkEnd(0);

    benchmarkBegin(1)
    //Do some more work
    double elapsedMS2 = benchmarkEnd(1);

    double speedup = benchmarkSpeedup(elapsedMS, elapsedMS2); //Calculates relative speedup
}
 

Ce serait également bien si la bibliothèque vous laissait faire de nombreux parcours, en les calculant en moyenne et en calculant la variance temporelle!

79voto

Gaurav Points 101

Utiliser la fonction clock () définie dans time.h

 startTime = (float)clock()/CLOCKS_PER_SEC;

/** Do work **/

endTime = (float)clock()/CLOCKS_PER_SEC;

timeElapsed = endTime - startTime;
 

51voto

Joe Points 798

Fondamentalement, tout ce que vous voulez, c'est un minuteur à haute résolution. Le temps écoulé est bien sûr juste une différence de temps et l'accélération est calculée en divisant les temps de chaque tâche. J'ai inclus le code pour un minuteur haute résolution qui devrait fonctionner au moins sur Windows et sur Unix.

 #ifdef WIN32

#include <windows.h>
double get_time()
{
    LARGE_INTEGER t, f;
    QueryPerformanceCounter(&t);
    QueryPerformanceFrequency(&f);
    return (double)t.QuadPart/(double)f.QuadPart;
}

#else

#include <sys/time.h>
#include <sys/resource.h>

double get_time()
{
    struct timeval t;
    struct timezone tzp;
    gettimeofday(&t, &tzp);
    return t.tv_sec + t.tv_usec*1e-6;
}

#endif
 

1voto

lhf Points 30556

Dans POSIX, essayez getrusage . L'argument approprié est RUSAGE_SELF et les champs pertinents sont ru_utime.tv_sec et ru_utime.tv_usec.

0voto

Mark Wilkins Points 29291

Il y a peut être des services publics existants qui aident avec cela, mais je soupçonne que la plupart va utiliser un certain type d'échantillonnage ou, éventuellement, de l'injection. Mais pour obtenir des sections spécifiques du code chronométré, vous aurez probablement à ajouter dans les appels à une minuterie comme vous le montrez dans votre exemple. Si vous utilisez Windows, puis de la haute performance de la minuterie fonctionne. J'ai répondu à une question similaire, et a montré l'exemple de code qui permettra de le faire. Il existe des méthodes similaires pour Linux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X