2010-04-07 18 views
8

Ich möchte wissen, welche Zeilen von C-Code zu einem Programm hinzugefügt werden, so dass es mir die Gesamtzeit angibt, die das Programm zum Ausführen benötigt. Ich denke, es sollte eine Zählerinitialisierung nahe dem Anfang von main und einer nach dem Ende der Hauptfunktion geben. Ist der richtige Header clock.h?Verstrichene Zeit zum Ausführen eines C-Programms

Vielen Dank ...

aktualisieren Ich habe eine Maschine Win Xp. Ergibt es nur clock() am Anfang und ein weiteres clock() am Ende des Programms? Dann kann ich den Zeitunterschied schätzen. Ja, du hast recht, es ist time.h.

Hier ist mein Code:

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#include <share.h> 
#include <time.h> 


void f(long double fb[], long double fA, long double fB); 

int main() { 

clock_t start, end; 
start = clock(); 


const int ARRAY_SIZE = 11; 

long double* z = (long double*) malloc(sizeof (long double) * ARRAY_SIZE); 

int i; 
long double A, B; 

if (z == NULL) { 
    printf("Out of memory\n"); 
    exit(-1); 
} 

A = 0.5; 
B = 2; 


for (i = 0; i < ARRAY_SIZE; i++) { 
    z[i] = 0; 
} 

z[1] = 5; 

f(z, A, B); 

for (i = 0; i < ARRAY_SIZE; i++) 
    printf("z is %.16Le\n", z[i]); 



free(z); 
z = NULL; 

end = clock(); 
printf("Took %ld ticks\n", end-start); 
printf("Took %f seconds\n", (double)(end-start)/CLOCKS_PER_SEC); 



return 0; 
} 

void f(long double fb[], long double fA, long double fB) { 
    fb[0] = fb[1]* fA; 
    fb[1] = fb[1] - 1; 
    return; 
} 

Einige Fehler mit MVS2008:

 
testim.c(16) : error C2143: syntax error : missing ';' before 'const' 
testim.c(18) :error C2143: syntax error : missing ';' before 'type' 
testim.c(20) :error C2143: syntax error : missing ';' before 'type' 
testim.c(21) :error C2143: syntax error : missing ';' before 'type'  
testim.c(23) :error C2065: 'z' : undeclared identifier 
testim.c(23) :warning C4047: '==' : 'int' differs in levels of indirection from 'void *' 
testim.c(28) : error C2065: 'A' : undeclared identifier 
testim.c(28) : warning C4244: '=' : conversion from 'double' to 'int', possible loss of data 

und es geht zu 28 Fehler. Beachten Sie, dass ich keine Fehler/Warnungen ohne Ihre Uhrcodes habe.

AKTUELLES: Ich habe leider keine gute Antwort hier erhalten. Aber nach einer Suche auf Google funktioniert der Code. Hier ist sie:

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#include <time.h> 


void f(long double fb[], long double fA); 

int main() { 

clock_t start = clock(); 


const int ARRAY_SIZE = 11; 

long double* z = (long double*) malloc(sizeof (long double) * ARRAY_SIZE); 

int i; 
long double A; 

if (z == NULL) { 
printf("Out of memory\n"); 
exit(-1); 
} 

A = 0.5; 


for (i = 0; i < ARRAY_SIZE; i++) { 
z[i] = 0; 
} 

z[1] = 5; 

f(z, A); 

for (i = 0; i < ARRAY_SIZE; i++) 
printf("z is %.16Le\n", z[i]); 



free(z); 
z = NULL; 

printf("Took %f seconds\n", ((double)clock()-start)/CLOCKS_PER_SEC); 



return 0; 
} 

void f(long double fb[], long double fA) { 
fb[0] = fb[1]* fA; 
fb[1] = fb[1] - 1; 
return; 
} 

Prost

-Update am 10. April: Hier ist eine bessere Lösung dank "JustJeff"

#include <windows.h> 
#include <stdio.h> 
#include <stdlib.h> 

void f(long double fb[], long double fA); 

const int ARRAY_SIZE = 11; 

int main(void) 
{ 

    long double* z = (long double*) malloc(sizeof (long double) * ARRAY_SIZE); 
    int i; 
    long double A; 

    LARGE_INTEGER freq; 
    LARGE_INTEGER t0, tF, tDiff; 
    double elapsedTime; 
    double resolution; 

    if (z == NULL) { 
    printf("Out of memory\n"); 
    exit(-1); 
    } 
    QueryPerformanceFrequency(&freq); 
    QueryPerformanceCounter(&t0); 
    // code to be timed goes HERE 
    { 
    A = 0.5; 


    for (i = 0; i < ARRAY_SIZE; i++) { 
    z[i] = 0; 
    } 

    z[1] = 5; 
    f(z, A); 


    for (i = 0; i < ARRAY_SIZE; i++) 
    printf("z is %.16Le\n", z[i]); 

    free(z); 
    z = NULL; 

    } 
QueryPerformanceCounter(&tF); 
tDiff.QuadPart = tF.QuadPart - t0.QuadPart; 
elapsedTime = tDiff.QuadPart/(double) freq.QuadPart; 
resolution = 1.0/(double) freq.QuadPart; 
printf("Your performance counter ticks %I64u times per second\n", freq.QuadPart); 
printf("Resolution is %lf nanoseconds\n", resolution*1e9); 
printf("Code under test took %lf sec\n", elapsedTime); 
return 0; 
} 


void f(long double fb[], long double fA) { 
fb[0] = fb[1]* fA; 
fb[1] = fb[1] - 1; 
return; 
} 

Es funktioniert sowohl mit MVS2008 und mit Borland C++ BuilderX von 2003.

+1

Sie können eine Antwort posten und akzeptieren, wenn Sie das Gefühl haben, dass Sie jetzt die beste Antwort selbst haben. Dies kann hilfreich für jemanden sein, der nach einer Antwort auf die jeweilige Frage sucht (und ich bin mir sicher, dass andere Leute ständig danach suchen). – Cam

+0

Ich weiß nicht, ob ich die richtige Antwort habe. Aber es funktioniert. Ich freue mich immer über konstruktive Vorschläge, während ich noch lerne. Kann ich meine eigene Antwort akzeptieren (ein Häkchen setzen)? – yCalleecharan

+0

Ja, Sie können. Und übrigens, ich will nicht unhöflich sein, aber wie hast du hier keine gute Antwort bekommen? Du hast ein paar nette Antworten, die funktionieren sollten. Wenn Sie Fehler bekommen, ist das Ihr eigener Code, nicht was die Beantworter Ihnen gegeben haben. Wenn Sie nicht glauben, dass die Antworten gut sind, sagen Sie uns bitte, wie wir sie verbessern können. – Javier

Antwort

1

Wenn Sie Windows verwenden und die Daten in Mikrosekunden messen möchten, untersuchen Sie QueryPerformanceCounter() und QueryPerformanceFrequency(). Auf vielen Systemen können diese die vollen Prozessor-Taktperioden auflösen, das dritte Zeug, und ich glaube nicht, dass ich es je grober als 3,5795 MHz gesehen habe, immer noch unter einer Mikrosekunde.

Sie rufen QueryPerformanceFrequency() auf, um zu ermitteln, wie viele Zählungen pro Sekunde der Zähler zählt. Rufen Sie dann QueryPerformanceCounter() vor dem Testcode und anschließend erneut auf. Delta die zwei Lesungen von QPC und dividiere durch den Zeitraum von QPF und Sie erhalten die verstrichene Zeit zwischen den zwei QPC-Aufrufe. Wie so ...

LARGE_INTEGER freq; 
LARGE_INTEGER t0, tF, tDiff; 
double elapsedTime; 
QueryPerformanceFrequency(&freq); 
QueryPerformanceCounter(&t0); 
// code to be timed goes HERE 
QueryPerformanceCounter(&tF); 
tDiff.QuadPart = tF.QuadPart - t0.QuadPart; 
elapsedTime = tDiff.QuadPart/(double) freq.QuadPart; 
// elapsedTime now has your measurement, w/resolution given by freq 

Offensichtlich greift auf diese eine Hardware-Zählgerät, das bis zu einem gewissen Systemoszillator auf der Hauptplatine verbunden ist, in diesem Fall sollten sie nicht Jitter von Software Last leiden. Die Auflösung hängt von Ihrem System ab.

VORGEHEN

Hier ist ein sehr einfaches komplettes Programm, das die Schnittstelle zeigt:

#include <windows.h> 
int main(void) 
{ 
    LARGE_INTEGER freq; 
    LARGE_INTEGER t0, tF, tDiff; 
    double elapsedTime; 
    double resolution; 
    QueryPerformanceFrequency(&freq); 
    QueryPerformanceCounter(&t0); 
    // code to be timed goes HERE 
    { 
     Sleep(10); 
    } 
    QueryPerformanceCounter(&tF); 
    tDiff.QuadPart = tF.QuadPart - t0.QuadPart; 
    elapsedTime = tDiff.QuadPart/(double) freq.QuadPart; 
    resolution = 1.0/(double) freq.QuadPart; 
    printf("Your performance counter ticks %I64u times per second\n", freq.QuadPart); 
    printf("Resolution is %lf nanoseconds\n", resolution*1e9); 
    printf("Code under test took %lf sec\n", elapsedTime); 
    return 0; 
} 

Für etwas so Einfaches wie das, es ist schneller die IDE zu überspringen, speichern Sie sie einfach in einem foo .c-Datei und (unter der Annahme von MS VS 2008) die Befehlszeile

cl foo.c 

verwenden, um es zu bauen. Hier ist die Ausgabe auf meinem System:

Your performance counter ticks 3579545 times per second 
Resolution is 279.365115 nanoseconds 
Code under test took 0.012519 sec 
+0

Danke. Das scheint mir etwas zu weit fortgeschritten :). – yCalleecharan

+0

die Anrufe sind wirklich ziemlich einfach, die Art, wie Sie sie verwenden, ist die gleiche wie bei clock(), die Auflösung ist viel besser als mit clock(), und der schlimmste Teil arbeitet mit 64-Bit-Ganzzahlen. Nun, es ist auch Windows-spezifisch, aber Sie haben Fenster markiert. – JustJeff

+0

Danke. Ich habe den Header windows.h hinzugefügt, aber ich bekomme immer noch Fehler. Ein Fehler tritt bei Zeile QueryPerformanceFrequency (&freq); Compiler beschwert: E2293) in Zeile 12 erwartet auf. Ein anderes ist: QueryPerformanceCounter (&t0); Fehler ist: E2293) erwartet in Zeile 13. Ein anderes ist tDiff = tF - t0; Fehler ist: E2096 Unzulässige Strukturoperation in der Funktion main in Zeile 57. Letzter Fehler: elapsedTime = tDiff/(double) freq; Fehler ist: E2110 Inkompatible Typkonvertierung in der Funktion main in Zeile 58. Ich habe das mit Borland C++ BuilderX kompiliert. Irgendein Vorschlag? – yCalleecharan

6

Auf Unix-Systemen (ich denke), der time Befehl mit dem Namen Ihres Programms als Befehlszeilenargument wird Ihnen sagen, die Zeit, die das Programm zum Ausführen benötigt. Beachten Sie, dass dies die Ausführungszeit des gesamten Programms misst. Wenn Sie nur einen Teil testen müssen, gehören time.h und die Uhrzeit-Funktion verwenden, mehr oder weniger wie folgt aus:

#include <time.h> 

int main() { 
    clock_t start; 
    clock_t end; 
    int function_time; 
    start = clock(); 
    function_you_want_to_time(); 
    end = clock(); 
    /* Get time in milliseconds */ 
    function_time = (double)(end - start)/(CLOCKS_PER_SEC/1000.0); 
    return 0; 
} 

, die Sie in Millisekunden die Zeit geben (man beachte die / 1000.0 Teil). Wenn Sie Sekunden benötigen, entfernen Sie / 1000.0. Wenn Sie Normal Uhr tickt wollen, die genauer sein wird, machen function_time eine clock_t und ersetzen Sie die function_time = ... Linie mit:

function_time = end - start; 

Zur Zeit das ganze Programm, schlage ich vor, eine Funktion _main() oder etwas zu machen, genannt, bewegen sich alle Ihr programmbezogener Code von main() (nicht der Timing-Code!) zu dieser Funktion und Aufruf von main(). Auf diese Weise wird klarer, was der Timing-Code ist und wie der Rest des Programms ist.

+0

Eine Kehrseite davon ist, dass, wenn Sie nur den tatsächlichen Berechnungsteil von etwas, zum Beispiel, und wollen Ressourcen/Daten Ladezeiten oder Ausgabezeiten oder was nicht enthalten, Zeit 'Befehl nicht tun können dies (seit es mal die gesamte Ausführung). – Amber

+0

Das stimmt. Anscheinend ist die 'clock()' Funktion dafür besser, aber ich wusste es nicht. Ich werde einen Satz hinzufügen. – Javier

+0

Danke. Bitte sehen Sie meinen aktualisierten Beitrag. – yCalleecharan

3

Sie könnten die clock()-Funktion (in <time.h>) verwenden, wenn Sie einen Codeblock oder das time-Programm auf * nix testen möchten, wie ein anderer Beantworter vorgeschlagen hat. Z.B.

> time ./foo my args 

Für die Uhr müssen Sie den Unterschied zwischen zwei Prüfpunkten subtrahieren. Z.B.

#include <time.h> 

void f() { 
    clock_t start, end; 

    start = clock(); 

    // some long code. 

    end = clock(); 
    printf("Took %ld ticks\n", end-start); 
    // or in (fractional) seconds. 
    printf("Took %f seconds\n", (double)(end-start)/CLOCKS_PER_SEC); 
} 

aktualisieren

Ihre neue Fehler betrifft, so können Sie nicht Code und Erklärungen in VC mischen. Sie dürfen keine Funktionen aufrufen und dann Variablen deklarieren. Deklarieren Sie alle Ihre Vars an der Spitze, oder kompilieren Sie mit C++ - Modus.

+0

Ich bekomme viele Fehler. Müssen wir den Typ von clock_t definieren, starten? – yCalleecharan

+0

time.h definiert clock_t. –

+0

Müssen wir die Leere f() haben? Oder können wir einfach clock_t starten, enden; start = clock(); ... end = clock(); printf ("Nimm% ld ticks \ n", end-start); Innen Haupt? – yCalleecharan

1

Wahrscheinlich möchten Sie time.h und die clock() Funktion.

+0

Danke. Bitte sehen Sie meinen aktualisierten Beitrag. – yCalleecharan

3

Wenn Sie insgesamt für das Programm dann in Linux-Konsole benötigen:

$ time myProgram 

Sie können auch in Ihrem Code verwenden time.h.

#include <time.h> 

int main(){ 
    time_t start, end; 
    start = time(0); 

    /* some working code */ 

    end = time(0); 
    printf("%i seconds", end - start); 
} 
+0

Ich bekomme viele Fehler. Müssen wir den Typ von time_t definieren, starten? – yCalleecharan

+0

Ich denke, es kann auch "int" sein. Ich musste es nirgends in meinem Ubuntu definieren. –

0

Sie können versuchen GetTickCount auch. Uhr funktioniert auch gut. Aber ich denke, die Uhrwerte ändern sich, wenn ein anderer Prozess oder ein anderer die Systemzeit manuell ändert, während die GetTickCount-Werte davon nicht betroffen sind.

+0

Ja, das ist eine Alternative. Ich werde das untersuchen. – yCalleecharan

Verwandte Themen