Zeitmessung C++
-
hallo!
Für JugendForscht benötige ich eine Zeitmessung per PC.
Diese muss extremst genau sein. Auf jeden Fall im Nanosekundenbereich.
welche möglichkeiten ergeben sich per C++?Gruß danke
-
Dieser Thread wurde von Moderator/in KlausB aus dem Forum VCL (C++ Builder) in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
doppelpost
aber vielleicht gibts in der WinAPI was tolles.
-
Dieser Thread wurde von Moderator/in volkard aus dem Forum C++ in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Bereits existenter Post: hier.
-
QueryPerformanceCounter()
http://msdn.microsoft.com/en-us/library/ms644904.aspx
-
schneller geht unter windoof nicht,oder?
Und unter Linux?
-
gast123 schrieb:
schneller geht unter windoof nicht,oder?
doch, mit rdtsc.
inline long long rdtsc(){ __asm rdtsc; } int main(){ int a; cin>>a; long long start=rdtsc(); long long end=rdtsc(); long long messzeit=end-start; start=rdtsc(); int z=1000000000/a; end=rdtsc(); cout<<z<<endl; cout<<"gedauert hats "<<end-start-messzeit<<" takte\n"; }
-
was für eine genauigkeit hat diese möglichkeit?
-
gast123 schrieb:
was für eine genauigkeit hat diese möglichkeit?
auflösung: taktfrequenz
achte drauf, daß den prozessor nicht auf energiesparende 800MHz runtertaktet, während du mißt. und wechsle den prozessor nicht.genauigkeit: fehler <0.1%
der prozessortakt war immer erstaunlich genau, wenn ich geschaut habe. hab ihn nie ungenauer als 0.01% gesehen.zuverlässigkeit: sehr mies
soll heißen, daß dein prog evtl gar nicht dran ist, wenn das signal reinkommt. musst deshalb sehr viele messungen machen und die unglaubwürdigen irgendwie rausfiltern. für messungen um nanosekundenbereich setze ich rdtsc ein, aber ich messe software aus, wo ich locker 1000000 messungen machen kann.
-
Super! Danke sehr!
Hab ich das richtig verstanden, dass die Zeitmessung über die Taktung des Prozessors läuft? Also je höher die Taktfrequenz desto feiner die Messungen?
PS:Das Forum werde ich mir merken. Hier wird einem ja wahnsinnig schnell und kompetent geholfen.
-
gast123 schrieb:
Hab ich das richtig verstanden, dass die Zeitmessung über die Taktung des Prozessors läuft? Also je höher die Taktfrequenz desto feiner die Messungen?
ja.
-
volkard schrieb:
gast123 schrieb:
was für eine genauigkeit hat diese möglichkeit?
auflösung: taktfrequenz
achte drauf, daß den prozessor nicht auf energiesparende 800MHz runtertaktet, während du mißt. und wechsle den prozessor nicht.genauigkeit: fehler <0.1%
der prozessortakt war immer erstaunlich genau, wenn ich geschaut habe. hab ihn nie ungenauer als 0.01% gesehen.zuverlässigkeit: sehr mies
soll heißen, daß dein prog evtl gar nicht dran ist, wenn das signal reinkommt. musst deshalb sehr viele messungen machen und die unglaubwürdigen irgendwie rausfiltern. für messungen um nanosekundenbereich setze ich rdtsc ein, aber ich messe software aus, wo ich locker 1000000 messungen machen kann.Und was soll das bringen wenn Windows durch seine "nicht Echtzeitfähigkeit" nicht garantieren kann, das der Code einfach unterbrochen wird?
(Oder das was er messen will?)
Da bekommt man auch nach 10000000000000000000 Versuchen nur nen Wert mit den durchschnittlichen Unterbrechungen raus.
(Mit Cache ein und Auslagerungen die nicht vorhersehbar sind will ich erst gar nicht anfangen)
Und selbst wenn man nur dem niedrigsten Wert Glauben schenk kann man nicht sagen, das es nicht doch unterbrochen wurde und es nicht noch schneller ginge.
=> Im Besten Fall nen "nur" einseitiger Fehler.genauigkeit: fehler <0.1%
Naja wenigsten besser als der normale Timer aber auch Query Performanche Counter kommt an solche Werte.
Also egal mit welchem Programm. Windows und genaue Zeitmessungen verträgt sich einfach nicht.
(Genauso wenig wie genaue Zeitmessung mit Systemen die Cache benutzen)Aber für JugendForscht wirds schon reichen. Die können ja nicht erwarten das man Zugriff auf ne Atomuhr hat

-
Mal nen kleines Wikipedia Zitat (englisch)
With the advent of multi-core/hyperthreaded CPUs, systems with multiple CPUs, and "hibernating" operating systems, the TSC cannot be relied on to provide accurate results. The issue has two components: rate of tick and whether all cores (processors) have identical values in their time-keeping registers. There is no promise that the timestamp counters of multiple CPUs on a single motherboard will be synchronized. In such cases, programmers can only get reliable results by locking their code to a single CPU. Even then, the CPU speed may change due to power-saving measures taken by the OS or BIOS, or the system may be hibernated and later resumed (resetting the time stamp counter).
Under Windows platforms, Microsoft strongly discourages using the TSC for high-resolution timing for exactly these reasons...
Die werden schon ihre Gründe dazu haben

-
würde das ganze unter Linux besser klappen?
Gruß
-
Unter Linux... gibt es Möglichkeiten eine SEHR genaue Zeitmessung hinzu bekommen.
Dazu solltest Du dich evtl. via Google genau nach "Zeitmessen & C++ & Linux" suchen. Ich habe die Artikel leider nicht mehr in den Favs.
Unter anderem wird dir hier die Funktion "gettimeofday( , )" sowie das struct "timeval" begegnen. Mit gettimeofday( , ) bekommst Du auf jeden Fall Microsekunden > 1 Ghz Takt.
Wenn ich mich noch Recht an meine Unizeit erinnere solltest Du an einem IBM PC bei der Genauigkeit immer an deinen CPU Takt gebunden sein. Das heißt Du kannst keine Zeit messen die zwischen 2 Takten vergeht.
Wenn Du wirklich SEHR genau Messungen durchführen möchtest ist ein PC dazu ein sicherlich sehr schlechtes Werkzeug.
-
Slashi schrieb:
Wenn Du wirklich SEHR genau Messungen durchführen möchtest ist ein PC dazu ein sicherlich sehr schlechtes Werkzeug.
Da kann ich nur zustimmen. Denn viele Dinge können einem bei einem PC die Messungen vermasseln. Die Forderung nach einer nanosekundengenauen Messung ist deswegen schlichtweg unmöglich.
@Sashi
Ich schätze mal dass man ohne einem speziellen Echtzeit-Betriebssystem nicht auskommen wird, so dass der zeitmessende Prozess vollen Zugriff auf den Prozessor und den Speicher hat. Trivial ist aber so etwas nicht.
-
Hallo
Passt zu dem Thema:
http://de.wikipedia.org/wiki/EchtzeitsystemwNw