it-swarm.com.de

Wie kann ich C-Code leicht vergleichen?

Gibt es eine einfache Bibliothek zum Benchmarking der Zeit, die erforderlich ist, um einen Teil des C-Codes auszuführen? Was ich will ist so etwas wie:

int main(){
    benchmarkBegin(0);
    //Do work
    double elapsedMS = benchmarkEnd(0);

    benchmarkBegin(1)
    //Do some more work
    double elapsedMS2 = benchmarkEnd(1);

    double speedup = benchmarkSpeedup(elapsedMS, elapsedMS2); //Calculates relative speedup
}

Es wäre auch großartig, wenn Sie in der Bibliothek viele Läufe ausführen, den Durchschnitt berechnen und die Abweichung beim Timing berechnen könnten!

48
Mike

Alles, was Sie wollen, ist ein hochauflösender Timer. Die verstrichene Zeit ist natürlich nur ein Zeitunterschied und die Beschleunigung wird berechnet, indem die Zeiten für jede Aufgabe geteilt werden. Ich habe den Code für einen hochauflösenden Timer beigefügt, der zumindest für Windows und Unix funktionieren sollte.

#ifdef WIN32

#include <windows.h>
double get_time()
{
    LARGE_INTEGER t, f;
    QueryPerformanceCounter(&t);
    QueryPerformanceFrequency(&f);
    return (double)t.QuadPart/(double)f.QuadPart;
}

#else

#include <sys/time.h>
#include <sys/resource.h>

double get_time()
{
    struct timeval t;
    struct timezone tzp;
    gettimeofday(&t, &tzp);
    return t.tv_sec + t.tv_usec*1e-6;
}

#endif
34
Joe

Verwenden Sie die in time.h definierte Funktion clock():

startTime = (float)clock()/CLOCKS_PER_SEC;

/* Do work */

endTime = (float)clock()/CLOCKS_PER_SEC;

timeElapsed = endTime - startTime;
35
Gaurav

Versuchen Sie in POSIX getrusage . Das relevante Argument ist RUSAGE_SELF und die relevanten Felder sind ru_utime.tv_sec und ru_utime.tv_usec.

1
lhf

Möglicherweise gibt es bereits vorhandene Hilfsprogramme, die dabei helfen, aber ich vermute, die meisten verwenden eine Art Probenahme oder Injektion. Um jedoch bestimmte Abschnitte des Codes zeitgesteuert zu erhalten, müssen Sie wahrscheinlich Aufrufe zu einem Timer hinzufügen, wie Sie es in Ihrem Beispiel zeigen. Wenn Sie Windows verwenden, funktioniert der Hochleistungstimer. Ich beantwortete eine ähnliche Frage und zeigte Beispielcode, der dies tun wird. Es gibt ähnliche Methoden für Linux.

0
Mark Wilkins