GNU/Linux >> Linux Esercitazione >  >> Linux

perché C clock() restituisce 0

Il modo corretto di utilizzare clock() per misurare il tempo sarebbe:

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

Questo perché non è garantito che clock_t sia un int o qualsiasi altro tipo.


Bene, vuoi l'ora something_else() prende? Prova questo:

#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;
}

Immagino che il motivo sia che il tuo something_else() consuma così poco tempo che supera la precisione di clock() . Ho provato a chiamare clock() due volte di conseguenza ed entrambi start e end è zero, ma il risultato è ragionevole quando eseguo alcune operazioni che richiedono tempo.

Ecco il mio frammento di codice di prova:

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;
}

E il risultato sul mio computer è:

start = 0, end = 27700000

Inoltre, due consigli:

  1. Durante il test, non utilizzare alcuna ottimizzazione del compilatore . Potresti pensare che il tuo something_else() richiede molto tempo, ma il compilatore potrebbe semplicemente ignorare tali operazioni (specialmente i cicli) poiché le considera prive di significato.
  2. Usa sizeof(clock_t) sulla tua piattaforma per vedere la dimensione di clock_t .

clock la funzione non misura i cicli di clock della CPU.

C dice clock "restituisce la migliore approssimazione dell'implementazione al tempo del processore utilizzato dal programma dall'inizio di un'era definita dall'implementazione relativa solo all'invocazione del programma."

Se tra due clock successivi chiama il tuo programma richiede meno tempo di una unità del clock funzione, potresti ottenere 0 .

POSIX clock definisce l'unità con CLOCKS_PER_SEC come 1000000 (l'unità è quindi 1 microsecondo).

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

Per misurare i cicli di clock in x86/x64 è possibile utilizzare l'assembly inline per recuperare il conteggio del clock del registro del contatore del timestamp della CPU rdtsc .


Linux
  1. Hashing delle password e perché ne abbiamo bisogno

  2. Perché Printf è meglio di Echo?

  3. Perché Cd non è un programma?

  4. Perché abbiamo bisogno di mktemp?

  5. gpspipe restituisce timestamp corretto, ma data errata (21 dic 1995)

Perché Linux è fondamentale per l'edge computing

Perché uso rxvt come terminale

I 10 motivi principali per utilizzare Linux

Perché i nerd usano Linux

Perché Kubernetes si chiama K8s?

Perché il mio rsync è così lento?