2009-04-15 5 views
4

Bei einem C-Prozess, der mit der höchsten Priorität ausgeführt wird, die die aktuelle Uhrzeit anfordert, wird die zurückgegebene Zeit für die Zeit angepasst, die der Code benötigt, um zum Benutzerprozessbereich zurückzukehren? Ist es veraltet, wenn du es bekommst? Als eine Messung, die die Ausführungszeit einer bekannten Anzahl von Montageanweisungen in einer Schleife nimmt und nach der Zeit davor und danach fragt, könnte sie eine Annäherung des Fehlers ergeben. Ich weiß, dass dies bei wissenschaftlichen Anwendungen ein Problem sein muss. Ich plane in naher Zukunft keine Software mit irgendwelchen Super-Collidern zu schreiben. Ich habe ein paar Artikel zu diesem Thema gelesen, aber sie geben nicht an, dass irgendeine Korrektur vorgenommen wurde, damit die Zeit, die Ihnen gegeben wird, der Zeit, die das System einliest, etwas voraus ist. Sollte ich den Schlaf über andere Dinge verlieren?Gibt es Aufrufe mit hoher Auflösung, um die Systemzeit bis zur Rückkehr der Funktion zu korrigieren?

Antwort

6

Ja, sie sind fast definitiv "falsch".

Bei Windows berücksichtigen die Timing-Funktionen nicht die Zeit, die für den Übergang in den Benutzermodus benötigt wird. Selbst wenn dies berücksichtigt wird, kann es nicht korrigieren, wenn die Funktion zurückkehrt und Ihr Code einen Seitenfehler trifft/ausgetauscht wird, bevor der Rückgabewert erfasst wird.

Im Allgemeinen sollten Sie bei der Zeitmessung eine Start- und Endzeit für eine große Anzahl von Iterationen festlegen, um diese Art von Unsicherheiten auszuschließen.

+0

Werden sie nicht um den gleichen Betrag falsch sein, wenn ich eine Menge von ihnen mache :( – ojblass

+0

Der Overhead wird Lärm sein, wenn Sie genug Iterationen machen. Sie fangen Zeit am Anfang und Ende einer großen Menge (z. B. 10k) und teile die Gesamtzeit durch die Anzahl der Iterationen – Michael

3

Ja, die Antwort, die Sie erhalten, wird um einen bestimmten (kleinen) Betrag abweichen; Ich habe noch nie von einer Timer-Funktion gehört, die die durchschnittliche Rückkehrzeit kompensiert, weil so etwas fast unmöglich vorherzusagen ist. Solche Dinge werden normalerweise implementiert, indem einfach ein Register in der Hardware gelesen wird und der Wert oder eine Version davon auf die geeignete Zeitskala skaliert wird.

Das sagte, ich würde nicht Schlaf darüber verlieren. Die akzeptierte Methode, um diesen Overhead davon abzuhalten, Ihre Messungen in irgendeiner signifikanten Weise zu beeinflussen, ist , um diese Timer für kurze Ereignisse nicht zu verwenden. In der Regel werden Sie mehrere hundert, tausend oder Millionen Hinrichtungen derselben Sache durchführen und durch die Anzahl der Hinrichtungen dividieren, um die durchschnittliche Zeit zu schätzen. So etwas ist normalerweise nützlicher als das Timing einer einzelnen Instanz, da es das durchschnittliche Cache-Verhalten, Betriebssystemeffekte usw. berücksichtigt.

+0

Nein bedeutet ja zu der Frage, ob ich dieses Recht lese – ojblass

+0

In der Tat, es war ein Ja zu 'ist es veraltet, wenn du es bekommst?', aber nein zur Frage in den Titel gestellt Aus Gründen der Klarheit –

+0

Die Fallstricke von mehr als eine Frage zu fragen nein, ja, nein, ja ... – ojblass

3

Nein, Sie sollten den Schlaf nicht verlieren. Keine Menge von Anpassung oder andere Software Tricks werden perfekte Ergebnisse auf einem System mit einem Pipeline-Prozessor mit mehrschichtigem Speicherzugriff führen ein Multi-Tasking-Betriebssystem mit Speicherverwaltung, Geräte, Interrupt-Handler ... nicht einmal, wenn Ihr Prozess hat die höchste Priorität.

Plus, unter der Unterschied von zwei solchen Zeiten wird den konstanten Overhead sowieso aufheben.

Edit: Ich meine ja, sollten Sie über andere Dinge Schlaf verlieren :).

+0

Die Fallstricke zu fragen mehr als eine Frage nein, ja, nein, ja ... – ojblass

1

Die meisten Probleme in der realen Welt mit hochauflösenden Timern werden für das Profiling verwendet, bei dem die Zeit einmal während START und einmal während FINISH gelesen wird. Also die meisten Male ~ fast ~ die gleiche Menge an Verzögerung in beide START und FINISH beteiligt. Und deshalb funktioniert es gut.

Nun, für Kernreaktoren, WINDOWS oder für so viele andere Betriebssysteme mit generischen Funktionen möglicherweise nicht geeignet. Ich denke, sie verwenden ECHTZEIT Betriebssysteme, die eine bessere genaue Zeitwerte als Desktop-Betriebssysteme geben könnten.

+0

Ich denke, RTOS ist ein großartiger Punkt, aber in Echtzeit muss man immer noch vom Kernel-Space in den User-Space wechseln ? Sind diese Zeiten korrigiert? Deltas in der Zeit sind wahrscheinlich um den gleichen Betrag, so dass Timing Dinge wahrscheinlich in der Kategorie fällt, die Sie erwähnen. – ojblass

Verwandte Themen