Ich hatte eine interessante Diskussion mit meinem Freund über das Benchmarking von C/C++-Code (oder Code im Allgemeinen). Wir haben eine einfache Funktion geschrieben, die getrusage
verwendet, um die CPU-Zeit für ein bestimmtes Stück Code zu messen. (Es misst, wie viel CPU-Zeit es gebraucht hat, um eine bestimmte Funktion auszuführen). Lassen Sie mich Ihnen ein Beispiel geben:
const int iterationen = 409600;
double s = measureCPU();
for( j = 0; j < iterationen; j++ )
funktion(args);
double e = measureCPU();
std::cout << (e-s)/iterationen << " s \n";
Wir haben darüber diskutiert, ob wir (e-s) durch die Anzahl der Iterationen teilen sollen oder nicht. Ich meine, wenn wir es nicht teilen, ist das Ergebnis in akzeptabler Form (z. B. 3,0 s), aber wenn wir es teilen, erhalten wir Ergebnisse wie 2,34385e-07 s ...
Also hier sind meine Fragen:
- Sollten wir (e-s) durch die Anzahl der Iterationen teilen, wenn ja, warum?
- Wie können wir 2,34385e-07 s in einer menschenlesbaren Form ausgeben? (sagen wir, es dauerte 0,00000003 s) ?
-
Sollen wir zunächst einen Funktionsaufruf einmal durchführen und danach die CPU-Zeit für Iterationen messen, so etwas Ähnliches:
// Erster Funktionsaufruf, kümmern wir uns überhaupt nicht darum funktion(args); // Echtes Benchmarking const int iterationen = 409600; double s = measureCPU(); for( j = 0; j < iterationen; j++ ) funktion(args); double e = measureCPU(); std::cout << (e-s)/iterationen << " s \n";