Mesurer le temps processeur sous Windows à l’aide de GetProcessTimes

Je voudrais mesurer le temps de calcul d’une fonction. Je sais comment utiliser GetProcessTimes , mais je ne parviens pas à l’implémenter avec une sorte de “redémarrage”:

Normalement, je le ferais comme ceci:

 #include "stdafx.h" #include  #include  double cputimer() { FILETIME createTime; FILETIME exitTime; FILETIME kernelTime; FILETIME userTime; if ( GetProcessTimes( GetCurrentProcess( ), &createTime, &exitTime, &kernelTime, &userTime ) != -1 ) { SYSTEMTIME userSystemTime; if ( FileTimeToSystemTime( &userTime, &userSystemTime ) != -1 ) return (double)userSystemTime.wHour * 3600.0 + (double)userSystemTime.wMinute * 60.0 + (double)userSystemTime.wSecond + (double)userSystemTime.wMilliseconds / 1000.0; } } int _tmain(int argc, _TCHAR* argv[]) { double start, stop; long sum = 0L; start = cputimer(); for (long long i = 1; i < 10000000; i++){ sum += log((double)i); } stop = cputimer(); printf("Time taken: %f [seconds]\n", stop - start); return 0; } 

Mais avec ‘reset’, je ne suis pas sûr d’avoir de bons résultats:

 #include "stdafx.h" #include  #include  #define START 1 #define STOP 0 double cputimer(int reset) { FILETIME createTime; FILETIME exitTime; FILETIME kernelTime; FILETIME userTime; double now = 0, then = 0; if ( GetProcessTimes( GetCurrentProcess( ), &createTime, &exitTime, &kernelTime, &userTime ) != -1 ) { SYSTEMTIME userSystemTime; if ( FileTimeToSystemTime( &userTime, &userSystemTime ) != -1 ) now = (double)userSystemTime.wHour * 3600.0 + (double)userSystemTime.wMinute * 60.0 + (double)userSystemTime.wSecond + (double)userSystemTime.wMilliseconds / 1000.0; } if(reset) { then = now; } else { then = now - then; } return then; } int _tmain(int argc, _TCHAR* argv[]) { double s; long sum = 0L; cputimer(START); for (long long i = 1; i < 10000000; i++){ sum += log((double)i); } s = cputimer(STOP); printf("Time taken: %f [seconds]\n", s); return 0; } 

Est-ce que je le fais correctement?

Je vous suggère d’utiliser une solution plus simple sous Windows, comme celle-ci, si votre processus ne s’exécute pas trop longtemps:

 #define WIN32_LEAN_AND_MEAN #include  double getTime() { LARGE_INTEGER freq, val; QueryPerformanceFrequency(&freq); QueryPerformanceCounter(&val); return (double)val.QuadPart / (double)freq.QuadPart; } 

Ensuite, vous pouvez simplement l’utiliser comme ceci:

 double d0 = getTime(); // function to measure double timeInMilliseconds = 1000* (getTime() - d0); 

Vous pouvez envelopper cela dans une fonction pour obtenir un comportement similaire à celui de votre code.

 double cputimer(int reset) { static double startTime = 0; if(reset) { startTime = getTime(); return 0.0; } else { return 1000* (getTime() - startTime); } } 

UPDATE: Si l’intention réelle était d’interroger l’ utilisateur, il faudrait remplacer la fonction getTime() (par celle utilisée par l’OP), mais la logique de cputimer() rest la même.

La valeur de retour d’échec pour les deux fonctions est 0, pas -1.