Frage

Im Moment ist Laden i eine Datei dann gettimeofday verwenden und die CPU-Zeit mit tv_usec Tracking

Meine Ergebnisse variieren, i 250er bis 280er bekommen, aber manchmal 300s oder 500 Jahre. Ich schrieb usleep und Schlaf (0) und (1) ohne Erfolg. Die Zeit ändert sich nach wie vor in beträchtlichem Ausmaß. Ich dachte, sleep (1) (Sekunden in Linux, nicht das Fenster Schlaf in ms) wäre es gelöst haben. Wie kann ich für den Test in einer konsistenten Art und Weise den Überblick über Zeit halten? Vielleicht sollte ich warten, bis ich eine viel größere Testdaten haben und komplexeren Code vor den Messungen zu beginnen?

War es hilfreich?

Lösung

Die derzeit empfohlene Schnittstelle für High-rez Zeit auf Linux (und POSIX im Allgemeinen) ist clock_gettime. Siehe Manpage.


clock_gettime(CLOCK_REALTIME, struct timespec *tp) //  for wall-clock time
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, struct timespec *tp) //  for CPU time

Aber lesen Sie die man-Seite. Beachten Sie, dass Sie mit -lrt verknüpfen müssen, weil POSIX so sagt, denke ich. Vielleicht Symbol Konflikte in -lc, für alte Programme zu vermeiden, die ihre eigenen clock_gettime definiert? Aber dynamische Libs verwenden schwache Symbole ...

Die beste Schlaffunktion ist nanosleep. Es ist nicht mess around mit Signalen oder einem Mist wie usleep. Es ist so definiert, nur schlafen, und keine anderen Nebenwirkungen haben. Und es sagt Ihnen, wenn Sie früh aufwachten (beispielsweise von Signalen), so dass Sie nicht unbedingt eine andere Zeitfunktion aufrufen müssen.

Wie auch immer, du wirst eine harte Zeit haben, eine Prüfung rep von etwas, die kurzen, die einen Systemaufruf handelt. Es gibt eine riesige Menge Gelegenheit für Abwechslung. z.B. der Planer entscheiden kann, dass einige andere Arbeit zu erledigen ist (unwahrscheinlich, wenn der Prozess gerade erst begonnen, Sie müssen Ihre Zeitscheibe noch nicht verbraucht). CPU-Cache (L2 und TLB) ist ohne weiteres möglich.

Wenn Sie eine Multi-Core-Maschine und ein Single-Threaded-Benchmark für den Code haben Sie zu optimieren, können Sie es Echtzeit-Priorität an einen Ihres Kern gepinnt geben. Stellen Sie sicher, dass Sie den Kern wählen, die nicht Behandlung von Unterbrechungen ist, oder der Tastatur (und alles andere) wird gesperrt, bis es fertig ist. Taskset verwendet (für eine CPU zu Pinning) und chrt (zur Einstellung in Echtzeit PRIO). Sehen Sie diese Mail ich mit diesem Trick, um gmp-devel gesendet: http://gmplib.org/list-archives/gmp- devel / 2008-März / 000789.html

Ach ja, für die präziseste Timing, können Sie RDTSC selbst verwenden (auf x86 / amd64). Wenn Sie keine anderen syscalls in haben, was Sie benching, dann ist es keine schlechte Idee. Schnappen Sie sich einen Benchmarking-Rahmen Ihre Funktion einfügen kann. GMP hat eine ziemlich anständig ein. Es ist vielleicht nicht gut eingerichtet für Funktionen Benchmarking, die nicht in GMP und mpn_whatever genannt, though. Ich erinnere mich nicht, und es ist ein Blick wert.

Andere Tipps

Sind Sie versuchen, zu messen, wie lange es dauert, eine Datei zu laden? Normalerweise, wenn Sie Performance-Tests einige Stück Code, das bereits ziemlich schnell (unter einer Sekunde), dann werden Sie den gleichen Code mehrere Male wiederholen (etwa tausend oder eine Million), die Zeit die ganze Menge, dann teilen Sie die Gesamtzeit durch die Anzahl der Iterationen.

Having said that, ich bin nicht ganz sicher, was Sie mit sleep () für. Können Sie ein Beispiel schreiben, was Sie zu tun beabsichtigen?

Ich würde empfehlen, dass Code in einer for-Schleife setzen. Führen Sie es über 1000 oder 10000 Iterationen. Es gibt Probleme mit diesem, wenn Sie nur ein paar Anweisungen zu tun, aber es sollte helfen.

Größere Datensätze auch Hilfe natürlich.

Schlaf wird Ihren Faden von der CPU deschedule. Es ist nicht genau Zeit mit Präzision zählen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top