web-dev-qa-db-fra.com

Pourquoi CLOCKS_PER_SEC n'est-il pas le nombre réel d'horloges par seconde?

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?

24
Kevin H. Lin

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.

32
Robᵩ

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.

20
Daniel Fischer
  1. CLOCKS_PER_SECOND dans POSIX est une constante égale à 1000000.
  2. CLOCKS_PER_SECOND n'est pas censé afficher le nombre d'horloge de votre processus. Il s'agit d'un numéro de résolution que vous pouvez utiliser pour convertir le nombre d'horloges en quantité de temps (voir la page de manuel pour la fonction horloge ()).

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 ()".

4
ImanKh

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.