2011-05-06 12 views
5
#import <stdio.h> 
#import <time.h> 

int main (void) { 

    printf("Clock ticks per second: %d\n", CLOCKS_PER_SEC); 
    double check = clock(); 
    int timex = time(NULL); 

    for (int x = 0; x <= 500000; x++) { 

     printf("."); 

    } 
    puts("\n"); 

    printf("Total Time by Clock: %7.7f\n", (clock() - check)/CLOCKS_PER_SEC); 
    printf("Total Time by Time: %d\n", time(NULL) - timex); 

    getchar(); 
} 

Cuando ejecuto el código anterior que obtener resultados como:malos resultados: Tiempo (NULL) y el reloj()

Tiempo total de reloj: 0.0108240

Tiempo total por hora: 12

Me gustaría que clock() represente un número lo más cercano posible al tiempo.

El tiempo total presentado anteriormente se realizó en un macbook, sin embargo, el código funciona excelente en mi computadora portátil (Windows).

La macro CLOCKS_PER_SECOND devuelve 1000 en la PC, 1,000,000 en la MAC.

Respuesta

8

reloj() en windows devuelve la hora del reloj de pared. clock() on * nixes devuelve el tiempo de CPU que ha gastado su programa, que no será demasiado, es probable que esté bloqueado al hacer E/S aquí.

+0

Thanks nos. ¿Hay alguna solución para Mac que pueda implementar para configurar un reloj de pared con un reloj de pared que sea estrictamente C, utilizando únicamente el uso de la biblioteca estándar? – Crosility

+0

uso, p. gettimeofday() – nos

+0

O el más moderno 'clock_gettime', que puede proporcionar una resolución de hasta un nanosegundo. –

0

time() devuelve time_t. Cuando lo asigna a un int, es posible que pierda información. ¿Qué sucede si usa time_t en todo momento?

int main(void) { 
    time_t timex = time(0); 
    /* ... */ 
    printf("%d", (int)(time(0) - timex)); 
} 
+2

Use difftime para calcular las diferencias 'time_t'. –

+0

No tengo problemas para usar el tiempo (0), solo el reloj(). Gracias por la ayuda sin embargo. el tiempo (0) parece estar funcionando como debería: devolver el tiempo en segundos desde una fecha especificada. – Crosility

1

printf() a la consola hace la llamada al sistema para cada llamada functon, y el tiempo dedicado bloqueado en el nuevo trazado de la consola, etc. no cuentan para el tiempo de proceso.

Haga algunos cálculos pesados ​​allí.

for (long int x = 0; x <= 5000000000; x++) { 
    sqrt(2.9999); 
} 
+0

¿Está diciendo que el reloj() SOLAMENTE cuenta el uso activo del proceso en sí? No seguimiento, por ejemplo: una marca de tiempo, desde el comienzo de la aplicación hasta un punto? – Crosility

+0

Depende de la implementación. Algunas implementaciones de UNIX cuentan tanto como los procesos secundarios esperados de tiempo de CPU, otros solo llaman al tiempo de CPU de proceso. De todos modos, si su proceso intentó llamar a printf() y se bloqueó porque xterm el tubo de entrada estaba lleno, este tiempo bloqueado definitivamente no se contará en clock() ... en todos los sistemas excepto en Windows: allí clock() devuelve wall- hora del reloj, no uso de la CPU. Generalmente, evite usar clock() si es posible: hay llamadas mucho mejores definidas como times() y getrusage(). – blaze

+0

Gracias Blaze, después de lanzar una aplicación, me he dado cuenta de que clock() y NSTimer simplemente no son tan eficientes como llamar al tiempo real. :) Gracias por la ayuda. – Crosility

Cuestiones relacionadas