Frage

Ich brauche eine sehr genaue Art und Weise zu Zeit Teilen meines Programms. Ich konnte die regelmäßige hochauflösenden Uhr für diese, aber das wird Zeit Wanduhr zurückkehren, was nicht das, was ich brauche. Ich needthe Zeit meinen Prozess verbrachte lief nur

Ich erinnere mich deutlich eine Linux-Kernel-Patch zu sehen, die mir erlauben würden, meine Prozesse zu Zeitgenauigkeit bis Nanosekunden, so ich nicht mit Lesezeichen, um es vergessen hatte, und ich vergaß den Namen des Patch auch:. (

Ich erinnere mich, wie es funktioniert aber:

Auf jedem Kontextwechsel wird es den Wert einer hochauflösenden Uhr ausgelesen und das Delta der letzten beiden Werte in die Prozesszeit des laufenden Prozesses hinzuzufügen. Dadurch entsteht ein hochauflösendes zutreffendes Bild von dem tatsächlichen Prozesszeit -Prozess.

Die regelmäßige Prozesszeit wird die regelmäßige Uhr gehalten verwenden, die ich glaube, Millisekunde genau (1000 Hz) ist, die für meine Zwecke viel zu groß ist.

Wer weiß, was Kernel-Patch ich rede? Ich erinnere mich, es auch wie ein Wort mit einem Brief war vor oder nach dem es - so etwas wie ‚rtimer‘ oder so etwas, aber ich weiß nicht mehr genau

.

(Andere Vorschläge sind willkommen zu)


Der Completely Fair Scheduler Vorgeschlagen von Marko vorgeschlagen ist nicht das, was ich suche, aber es sieht vielversprechend aus. Das Problem habe ich mit ihm ist, dass die Anrufe kann ich sind Prozesszeit bekommen verwenden, um noch nicht Werte zurückgegeben werden, die genügend granular sind.

  • Male () zurückkehrt Werte 21, 22, in Millisekunden.
  • clock () zurückkehren Werte 21000, 22000, gleiche Granularität.
  • getrusage () wird Werte wie 210002, 22001 (und etc. zu jagen) zurückkehrt, sie sehen etwas bessere Genauigkeit zu haben, aber die Werte aussehen auffallend gleich.

So, jetzt das Problem, das ich wahrscheinlich habe, ist, dass der Kernel die Informationen, die ich brauche, ich habe nicht nur den Systemaufruf weiß, dass sie zurückkehren wird.

War es hilfreich?

Lösung

Wenn Sie sich für dieses Niveau der Zeitauflösung suchen, versuchen Sie wahrscheinlich einige Mikro-Optimierung zu tun. Wenn das der Fall ist, sollte man sich PAPI . Nicht nur, dass es sowohl wanduhr und virtuelle (Prozess nur) Timing-Informationen, sondern bietet auch Zugriff auf CPU-Ereigniszähler, die unverzichtbar sein können, wenn Sie versuchen, die Leistung zu verbessern.

http://icl.cs.utk.edu/papi/

Andere Tipps

Siehe diese Frage für ein paar mehr Infos .

Etwas, das ich für solche Dinge verwendet habe, ist gettimeofday (). Es bietet eine Struktur mit Sekunden und Mikrosekunden. Nennen Sie es vor dem Code, und wieder nach. Dann subtrahieren Sie einfach die beiden structs timersub verwenden, und Sie können die Zeit, die in Sekunden vom tv_usec Feld erhalten.

Wenn Sie sehr kleine Zeiteinheiten für (ich nehme an) Testen Sie die Geschwindigkeit Ihrer Software, würde ich empfehlen, nur die Teile laufen Sie in einer Schleife millionenfach zu Zeit wollen, nehmen Sie die Zeit vor und nach der Schleife und Berechnung der durchschnittlichen. Ein schöner Nebeneffekt, dies zu tun (abgesehen von nicht um herauszufinden, um wie ns zu verwenden) ist, dass Sie mehr konsistente Ergebnisse erhalten würden, weil der zufällige Kopf vom o sceduler verursacht wird ausgemittelt.

Natürlich, es sei denn, Ihr Programm ist nicht in der Lage sein muß Millionen mal in einer Sekunde zu laufen, ist es wahrscheinlich schnell genug, wenn man nicht eine Millisekunde Laufzeit messen kann.

Ich glaube, CFC ( Completely Fair Scheduler ) ist das, was Sie suchen.

Sie können die High Precision Event Timer verwenden ( HPET ), wenn Sie eine relativ neue haben 2.6 Kernel. Schauen Sie sich Dokumentation / hpet.txt auf, wie es zu benutzen. Diese Lösung ist plattformabhängig, obwohl ich glaube, dass es auf neueren x86-Systemen verfügbar ist. HPET hat mindestens ein 10MHz-Timer, so dass es leicht Ihre Anforderungen entsprechen sollte.

ich mehrere PowerPC-Implementierungen von Freescale unterstützt einen Zyklus genaue Befehlszähler als auch glauben. Ich habe diese eine Reihe von Jahren hoch optimierten Code zu profilieren, aber ich kann mich nicht erinnern, was es heißt. Ich glaube, Freescale einen Kernel-Patch hat Sie beantragen, um Zugang vom Benutzerraum.

http://allmybrain.com/2008/ 10.06 / Timing-cc-Code-on-Linux /

könnte sein, dass Sie Hilfe (direkt, wenn Sie es in C / C ++ tun, aber ich hoffe, dass es Sie gibt Hinweise, auch wenn Sie nicht) ... Es behauptet Mikrosekunde Genauigkeit zu schaffen, die nur geht Ihr Kriterium. :)

Ich glaube, ich den Kernel-Patch gefunden ich suchte. Posting hier, damit ich den Link nicht vergessen:

http://user.it.uu.se/~mikpe/ linux / PERFCTR / http://sourceforge.net/projects/perfctr/

Edit: Es funktioniert für meine Zwecke, wenn auch nicht sehr benutzerfreundlich

.

Versuchen Sie, die Zeitstempel-Zähler ? Wikipedia scheint mit clock_gettime vorschlagen ().

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