2012-04-14 25 views
6

To jest "algorytm", ale kiedy chcę zmierzyć czas wykonania, daje mi zero. Czemu?C jak poprawnie mierzyć czas?

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

Co należy zrobić, aby zmierzyć czas?

Odpowiedz

14

dwie rzeczy:

  1. 10000 nie jest dużo na nowoczesnym komputerze. W związku z tym pętla ta będzie działała prawdopodobnie krócej niż milisekundę - mniej niż precyzja clock(). Dlatego zwróci zero.

  2. Jeśli nie korzystasz z wyniku non_parallel, możliwe jest, że cała pętla zostanie zoptymalizowana przez kompilator.

Najprawdopodobniej wystarczy droższej pętlę. Spróbuj zwiększyć ARRAY_SIZE na coś o wiele większego.


Oto test na moim komputerze z większego rozmiaru tablicy:

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

wyjściowa:

Number of seconds: 0.446000 
5

Jest to niewiarygodny sposób na faktyczną liczbę sekund, ponieważ funkcja clock() ma dość małą precyzję, a pętla nie wykonuje wiele pracy. Możesz albo sprawić, żeby twoja pętla robiła więcej, żeby działała dłużej, albo użyć lepszej metody pomiaru czasu.

Wyższe metody precyzyjne są zależne od platformy. W przypadku systemu Windows, zobacz How to use QueryPerformanceCounter? i Linux zobaczyć High resolution timer with C++ and Linux?

+3

Um nie, PO jest już rzucając jeden z argumentów do "podwójnego". – Mysticial

+0

@Mysticial Fail z mojej strony, poprawiono moją odpowiedź. – jli

+0

Następnie mogę dać +1 teraz za wzmiankę o wysokowydajnych licznikach. – Mysticial

Powiązane problemy