web-dev-qa-db-fra.com

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!

48
Mike

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
34
Joe

Utilisez 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;
35
Gaurav

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

1
lhf

Il se peut que des utilitaires existants aident à cela, mais je suppose que la plupart d'entre eux utiliseront un type d'échantillonnage ou éventuellement une injection. Mais pour obtenir des sections spécifiques de code chronométrées, vous devrez probablement ajouter des appels à une minuterie, comme vous le montrez dans votre exemple. Si vous utilisez Windows, le minuteur hautes performances fonctionne. I a répondu à une question similaire et ai montré un exemple de code qui le ferait. Il existe des méthodes similaires pour Linux.

0
Mark Wilkins