2012-04-14 9 views
6

Dies ist der "Algorithmus", aber wenn ich die Ausführungszeit messen will, gibt es mir Null. Warum?C Wie misst man die Zeit richtig?

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

Also was soll ich tun, um die Zeit zu messen?

Antwort

14

Zwei Dinge sehen:

  1. 10000 ist nicht viel auf einem modernen Computer. Daher wird diese Schleife wahrscheinlich in weniger als einer Millisekunde ausgeführt - weniger als die Genauigkeit von clock(). Daher wird es Null zurückgeben.

  2. Wenn Sie nicht das Ergebnis von non_parallel verwenden, ist es möglich, dass die gesamte Schleife vom Compiler optimiert wird.

Höchstwahrscheinlich benötigen Sie nur eine teurere Schleife. Versuchen Sie, ARRAY_SIZE zu etwas viel größerem zu erhöhen.


Hier ist ein Test auf meiner Maschine mit einer größeren Array-Größe:

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

Ausgang:

Number of seconds: 0.446000 
5

Dies ist eine unzuverlässige Art und Weise, um die tatsächliche Anzahl der Sekunden, da die clock() Funktion ist ziemlich niedrige Präzision, und Ihre Schleife macht nicht viel Arbeit. Sie können Ihre Schleife entweder so einrichten, dass sie länger läuft, oder eine bessere Zeitmethode verwenden.

Die Methoden mit höherer Genauigkeit sind plattformspezifisch. Für Windows siehe How to use QueryPerformanceCounter? und für Linux High resolution timer with C++ and Linux?

+3

Um nein, wird das OP bereits einer der Operanden Gießen zu "verdoppeln". – Mysticial

+0

@Mysticial Fail meinerseits, meine Antwort behoben. – jli

+0

Dann kann ich jetzt +1 für die Erwähnung von Hochleistungszählern geben. – Mysticial

Verwandte Themen