La différence d’horloge de MATLAB’s tic-toc & C

J’ai écrit du code C que j’appelle sous la forme MATLAB après l’avoir compilé avec MEX. À l’intérieur du code C, je mesure le temps d’une partie du calcul à l’aide du code suivant:

clock_t begin, end; double time_elapsed; begin = clock(); /* do stuff... */ end = clock(); time_elapsed = (double) ((double) (end - begin) / (double) CLOCKS_PER_SEC); 

Le temps écoulé devrait être le temps d’exécution en secondes.

J’ai ensuite time_elapsed la valeur time_elapsed dans MATLAB (elle est correctement exscope; j’ai vérifié). Ensuite, côté MATLAB, j’appelle cette fonction C (après l’avoir compilée avec MEX) et mesure son temps d’exécution à l’aide de tic et de toc . Ce qui s’avère être une absurdité complète est que le temps que je calcule avec tic et toc est de 0.0011s (moyenne sur 500 exécutions, st. Dev. 1.4e-4), tandis que le temps renvoyé par le code C est de 0.037s ( moyenne sur 500 courses, st dev. 0,0016).

Ici, on peut remarquer deux faits très étranges:

  1. Le temps d’exécution de la fonction entière est inférieur au temps d’exécution d’une partie du code. Par conséquent, les mesures de MATLAB ou de C sont fortement imprécises.
  2. Les temps d’exécution mesurés dans le code C sont très dispersés et présentent une température st très élevée. écart (coefficient de variation de 44%, contre seulement 13% pour le tic-toc).

Que se passe-t-il avec ces timers?

Vous comparez des pommes à des oranges.

Regardez la documentation de Matlab:

tichttp://www.mathworks.com/help/matlab/ref/tic.html
tochttp://www.mathworks.com/help/matlab/ref/toc.html

tic et toc vous permettent de mesurer le temps réel écoulé.

Examinons maintenant la fonction d’ horloge http://linux.die.net/man/3/clock .

En particulier,

La fonction clock () renvoie une approximation du temps processeur utilisé par le programme.

La valeur renvoyée est le temps CPU utilisé jusqu’à présent comme clock_t; Pour obtenir le nombre de secondes utilisées, divisez par CLOCKS_PER_SEC. Si le temps processeur utilisé n’est pas disponible ou si sa valeur ne peut pas être représentée, la fonction renvoie la valeur (clock_t) -1.

Alors, que peut expliquer votre différence:

  • Le temps de calcul (mesuré par clock ()) et le temps réel écoulé (mesuré par tic et toc) ne sont pas identiques. Vous vous attendriez donc à ce que le temps de l’unité centrale soit inférieur au temps écoulé? Peut-être. Que se passe-t-il si vous conduisez 10 cœurs à 100% dans un délai de 0.0011s? Cela voudrait dire que la mesure clock () est 10 fois celle mesurée avec tic et toc. Possible, improbable.
  • clock (.) est grossièrement inexact, et conforme à la documentation, il s’agit d’une mesure approximative du temps de l’unité centrale! Je soupçonne que cela est lié à la taille quantique du planificateur, mais je n’ai pas fouillé dans le code du kernel Linux à vérifier. Je n’ai pas non plus vérifié d’autres systèmes d’exploitation, mais le blog de ce type est conforme à cette théorie.

Alors quoi faire … pour commencer, comparez des pommes avec des pommes! Ensuite, assurez-vous de prendre en compte la résolution de la timer.