GNU/Linux >> Tutoriels Linux >  >> Linux

pourquoi C clock() renvoie 0

La bonne façon d'utiliser clock() pour mesurer le temps serait :

printf("\nTime elapsed: %.2f\n",1.0*(end-start)/CLOCKS_PER_SEC);

En effet, il n'est pas garanti que clock_t soit un int, ou tout autre type d'ailleurs.


Eh bien, voulez-vous l'heure something_else() prend? Essayez ceci :

#include <sys/time.h>
#include <stdio.h>  
#include <unistd.h>
int main(void) {
    struct timeval start, end;
    long mtime, secs, usecs;    

    gettimeofday(&start, NULL);
    something_else();
    gettimeofday(&end, NULL);
    secs  = end.tv_sec  - start.tv_sec;
    usecs = end.tv_usec - start.tv_usec;
    mtime = ((secs) * 1000 + usecs/1000.0) + 0.5;
    printf("Elapsed time: %ld millisecs\n", mtime);
    return 0;
}

Je suppose que la raison est que votre something_else() consomme si peu de temps qu'il dépasse la précision de clock() . J'ai essayé d'appeler le clock() deux fois par conséquent et les deux start et end est égal à zéro, mais le résultat est raisonnable lorsque je fais des choses qui prennent du temps entre les deux.

Voici mon extrait de code de test :

int main(void) {   
    clock_t start, end;
    start = clock();
    int c;
    for (int i = 0; i < 100; i++) {
        for (int j = 0; j < (1<<30); j++) {
            c++;
        }
    }
    end = clock();
    printf("start = %d, end = %d\n", start, end);
    return 0;
}

Et le résultat sur mon ordinateur est :

start = 0, end = 27700000

Aussi, deux conseils:

  1. Lors des tests, n'utilisez aucune optimisation du compilateur . Vous pensez peut-être que votre something_else() prend du temps, mais le compilateur peut simplement ignorer ces opérations (en particulier les boucles) car il les considère comme dénuées de sens.
  2. Utilisez sizeof(clock_t) sur votre plateforme pour voir la taille de clock_t .

clock la fonction ne mesure pas les cycles d'horloge du processeur.

C dit clock "renvoie la meilleure approximation de l'implémentation au temps processeur utilisé par le programme depuis le début d'une ère définie par l'implémentation liée uniquement à l'invocation du programme."

Si entre deux clock successifs appelle votre programme prend moins de temps qu'une unité de clock fonction, vous pourriez obtenir 0 .

POSIX clock définit l'unité avec CLOCKS_PER_SEC comme 1000000 (l'unité vaut alors 1 microseconde).

http://pubs.opengroup.org/onlinepubs/009604499/functions/clock.html

Pour mesurer les cycles d'horloge dans x86/x64, vous pouvez utiliser l'assemblage en ligne pour récupérer le nombre d'horloges du registre du compteur d'horodatage CPU rdtsc .


Linux
  1. Pourquoi Printf est-il meilleur qu'Echo ?

  2. Pourquoi le CD n'est-il pas un programme ?

  3. Df Vs. Du:Pourquoi tant de différence ??

  4. Pourquoi Nullglob n'est-il pas par défaut ?

  5. Pourquoi avons-nous besoin de mktemp ?

Pourquoi j'utilise rxvt comme terminal

Les 10 meilleures raisons d'utiliser Linux

Pourquoi les nerds utilisent Linux

Pourquoi Kubernetes s'appelle-t-il K8s ?

Pourquoi netstat est-il obsolète ?

Pourquoi ne pas bloquer ICMP ?