GNU/Linux >> Tutoriales Linux >  >> Linux

por qué C clock () devuelve 0

La forma correcta de usar clock() para medir el tiempo sería:

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

Esto se debe a que no se garantiza que clock_t sea un int, o cualquier otro tipo.


Bueno, quieres la hora something_else() ¿toma? Prueba esto:

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

Supongo que la razón es que tu something_else() consume tan poco tiempo que excede la precisión de clock() . Intenté llamar a clock() dos veces en consecuencia y ambos start y end es cero, pero el resultado es razonable cuando hago algunas cosas que consumen mucho tiempo.

Aquí está mi fragmento de código de prueba:

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

Y el resultado en mi computadora es:

start = 0, end = 27700000

Además, dos consejos:

  1. Al realizar pruebas, no utilice ninguna optimización del compilador . Puedes pensar que tu something_else() lleva mucho tiempo, pero el compilador puede ignorar esas operaciones (especialmente los bucles) ya que las considera sin sentido.
  2. Usar sizeof(clock_t) en su plataforma para ver el tamaño de clock_t .

clock La función no mide los ciclos de reloj de la CPU.

C dice clock "devuelve la mejor aproximación de la implementación al tiempo de procesador utilizado por el programa desde el comienzo de una era definida por la implementación relacionada únicamente con la invocación del programa".

Si entre dos clock sucesivos llama a tu programa toma menos tiempo que una unidad del clock función, podría obtener 0 .

POSIX clock define la unidad con CLOCKS_PER_SEC como 1000000 (la unidad es entonces 1 microsegundo).

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

Para medir los ciclos de reloj en x86/x64, puede usar el ensamblado en línea para recuperar el conteo de reloj del registro del contador de marca de tiempo de la CPU rdtsc .


Linux
  1. gpspipe devuelve la marca de tiempo correcta, pero la fecha incorrecta (21 de diciembre de 1995)

  2. sudo -i devuelve un error

  3. ¿Por qué netstat está en desuso?

  4. ¿Por qué no bloquear ICMP?

  5. ¿Por qué mi rsync es tan lento?

Por qué uso rxvt como mi terminal

Las 10 razones principales por las que usar Linux

Por qué los nerds usan Linux

¿Por qué Nullglob no es predeterminado?

¿Por qué Kubernetes se llama K8?

¿Por qué necesitamos mktemp?