2017-06-12 1 views
4

J'essayais de mesurer le temps nécessaire pour exécuter une fonction spécifique dans mon code. Dans un premier temps je la fonction clock() comme ci-dessousDifférence de temps mesurée par clock et steady_clock

clock_t start = clock(); 
do_something(); 
clock_t end = clock(); 

printf("Time taken: %f ms\n", ((double) end - start)*1000/CLOCKS_PER_SEC); 

Plus tard, je lisais à propos de la bibliothèque chrono dans C++11 et essayé de mesurer la même chose avec un std::chrono::steady_clock comme ci-dessous

using namespace std::chrono; 

auto start = steady_clock::now(); 
do_something(); 
auto end = steady_clock::now(); 
printf("Time taken: %lld ms\n", duration_cast<milliseconds>(end - start).count()); 

Le temps mesuré par le premier code l'extrait (utilisant clock) était 89.53 ms et celui mesuré par steady_clock était 1140 ms.

Pourquoi y a-t-il une aussi grande différence de temps mesurée par les deux horloges?

+0

Si possible, pourriez-vous créer un [mcve] s'il vous plaît? – Rakete1111

+0

@ Rakete1111: Voici le [lien] (http://coliru.stacked-crooked.com/a/9f74e57079978629) à un petit test où le problème est reproductible. –

Répondre

5

clock mesure le temps processeur, tandis que steady_clock mesure le temps physique. Donc, vous pouvez obtenir des différences comme ceci si do_something() a été préempté par d'autres processus (comme la vérification du courrier ou autre).

Daniel H fait un bon point ci-dessous dans les commentaires que cela peut également se produire si do_something() n'est pas lié à l'UC. Par exemple, si elle dort, bloque le verrouillage d'un mutex, attend une variable de condition, etc.

+2

Cela apparaîtrait aussi que l'id 'do_something' n'est pas lié au CPU, n'est-ce pas? –

+0

@DanielH: Merci Daniel, bon point. J'ai ajouté votre commentaire à ma réponse. –

+0

@HowardHinnant Quelle serait l'approche correcte pour mesurer le temps pris par une fonction qui peut dormir, bloquer sur un mutex etc? –