2012-04-14 44 views
6

Este es el "algoritmo", pero cuando quiero medir el tiempo de ejecución me da cero. ¿Por qué?C ¿cómo medir el tiempo correctamente?

#define ARRAY_SIZE 10000 
... 

clock_t start, end; 

start = clock(); 

for(i = 0; i < ARRAY_SIZE; i++) 
{ 
non_parallel[i] = vec[i] * vec[i]; 
} 
end = clock(); 
printf("Number of seconds: %f\n", (end-start)/(double)CLOCKS_PER_SEC); 

Entonces, ¿qué debo hacer para medir el tiempo?

Respuesta

14

dos cosas:

  1. 10000 no es mucho en un equipo moderno. Por lo tanto, ese ciclo se ejecutará probablemente en menos de un milisegundo, menos que la precisión de clock(). Por lo tanto, devolverá cero.

  2. Si no está utilizando el resultado de non_parallel, es posible que el compilador optimice todo el ciclo.

Lo más probable es que solo necesite un bucle más caro. Intente aumentar ARRAY_SIZE a algo mucho más grande.


Aquí está una prueba en mi máquina con un tamaño mayor variedad:

#define ARRAY_SIZE 100000000 

int main(){ 

    clock_t start, end; 

    double *non_parallel = (double*)malloc(ARRAY_SIZE * sizeof(double)); 
    double *vec   = (double*)malloc(ARRAY_SIZE * sizeof(double)); 

    start = clock(); 

    for(int i = 0; i < ARRAY_SIZE; i++) 
    { 
     non_parallel[i] = vec[i] * vec[i]; 
    } 

    end = clock(); 
    printf("Number of seconds: %f\n", (end-start)/(double)CLOCKS_PER_SEC); 


    free(non_parallel); 
    free(vec); 
    return 0; 
} 

Salida:

Number of seconds: 0.446000 
5

Esta es una forma poco confiable de medir el tiempo en segundos, ya que la función clock() es de muy baja precisión, y su bucle no está haciendo un gran trabajo. Puedes hacer que tu loop haga más para que funcione más tiempo, o usar un mejor método de sincronización.

Los métodos de mayor precisión son específicos de la plataforma. En Windows, consulte How to use QueryPerformanceCounter? y para Linux ver High resolution timer with C++ and Linux?

+3

Um no, el PO ya se está lanzando uno de los operandos a 'doble'. – Mysticial

+0

@Mysticial Fallo de mi parte, corrigió mi respuesta. – jli

+0

Entonces ahora puedo +1 mencionar los contadores de alto rendimiento. – Mysticial

Cuestiones relacionadas