Je viens d'écrire ce court programme C++ pour approximer le nombre réel de tics d'horloge par seconde.
#include <iostream>
#include <time.h>
using namespace std;
int main () {
for(int i = 0; i < 10 ; i++) {
int first_clock = clock();
int first_time = time(NULL);
while(time(NULL) <= first_time) {}
int second_time = time(NULL);
int second_clock = clock();
cout << "Actual clocks per second = " << (second_clock - first_clock)/(second_time - first_time) << "\n";
cout << "CLOCKS_PER_SEC = " << CLOCKS_PER_SEC << "\n";
}
return 0;
}
Lorsque j'exécute le programme, j'obtiens une sortie qui ressemble à ceci.
Actual clocks per second = 199139
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 638164
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 610735
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 614835
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 642327
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 562068
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 605767
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 619543
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 650243
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 639128
CLOCKS_PER_SEC = 1000000
Pourquoi le nombre réel de tics d'horloge par seconde ne correspond-il pas à CLOCKS_PER_SEC? Ils ne sont même pas à peu près égaux. Que se passe t-il ici?
clock
renvoie le temps passé dans votre programme. Il y a 1 000 000 de tics d'horloge par seconde au total*. Il semble que votre programme en ait consommé 60%.
Quelque chose d'autre a utilisé les 40% restants.
*D'accord, il y a pratiquement 1 000 000 de tics d'horloge par seconde. Le nombre réel est normalisé de sorte que votre programme détecte 1 000 000 de ticks.
Depuis la page de manuel de clock(3)
:
POSIX requiert que CLOCKS_PER_SEC soit égal à 1000000 indépendamment de la résolution réelle.
Votre implémentation semble suivre POSIX au moins à cet égard.
En exécutant votre programme ici, je reçois
Actual clocks per second = 980000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 1000000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 990000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 1000000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 1000000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 1000000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 1000000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 1000000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 1000000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 1000000
CLOCKS_PER_SEC = 1000000
ou une sortie similaire sur une machine inactive, et une sortie comme
Actual clocks per second = 50000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 600000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 530000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 580000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 730000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 730000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 600000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 560000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 600000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 620000
CLOCKS_PER_SEC = 1000000
sur une machine occupée. Puisque clock()
mesure le temps (approximatif) passé dans votre programme, il semble que vous ayez testé sur une machine occupée et que votre programme n'ait obtenu qu'environ 60% du temps CPU.
Par exemple, si vous calculez:
(second_clock-first_clock)/CLOCKS_PER_SEC
vous obtiendrez le temps total entre le premier et le deuxième appel à la fonction "horloge ()".
Norme C99
La seule chose que le projet standard C99 N1256 dit à propos de CLOCKS_PER_SEC
est-ce:
CLOCKS_PER_SEC qui se développe en une expression de type clock_t (décrite ci-dessous) qui est le nombre par seconde de la valeur retournée par la fonction d'horloge
Comme d'autres le mentionnent, POSIX le fixe à 1 million, ce qui limite sa précision à 1 microseconde. Je pense que ce n'est qu'une valeur historique des jours où les fréquences CPU maximales ont été mesurées en méga-hertz.