 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Gentoopower Guest
|
Posted: Fri Oct 07, 2005 3:47 pm Post subject: Uhr mit genauerer Auflösung |
|
|
Hallo ich habe folgendes Problem.
Ich benötige eine Zeitfunktion, die mir eine genauere Auflösung bringt
als die time() funktion, die ja nur mit einer Genauigkeit von 1s arbeitet.
Ich benötige ca 1ms Genauigkeit.
Gibts da schon irgendwo Bibliotheken für sowas, hat sonst jemand ne Idee?
Ziel ist es in meiner Anwendung zu messen, wann bestimmte Aktionen auf
einen Ausgangspunkt(Programmstart) hin eingetreten sind, also mir reicht
dabei die relative Zeit nach Programmstart.
Sprich Zeit 0 = Programmstart
nach 2,120s wurde ein Knopf gedrückt
nach 4,500s wurde eine Beredchnung fertig .....
Danke im voraus für eure Ideen.
Viele Grüße Stefan
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Richard Guest
|
Posted: Fri Oct 07, 2005 11:09 pm Post subject: Re: Uhr mit genauerer Auflösung |
|
|
Stefan Ram wrote:
| Quote: | Gentoopower <gentoopower (AT) yahoo (DOT) de> writes:
Ich benötige eine Zeitfunktion, die mir eine genauere Auflösung
bringt als die time() funktion, die ja nur mit einer
Genauigkeit von 1s arbeitet.
Das ist durch C++ nicht so spezifiziert, die Granularität
ist implementationsbestimmt.
Ich benötige ca 1ms Genauigkeit.
Deine Implementation von ::std::time() könnte diese
Anforderung ja schon erfüllen. Sonst wird ein entsprechender
Aufruf der Umgebung (Betriebssystem, Uhr) benötigt.
|
Stimmt time() kann das sogar, habs gerade in der MSDN nachgelesen:
struct __timeb64 tstruct;
_ftime64( &tstruct );
printf( "milliseconds:ttt%un", tstruct.millitm );
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Dirk Jagdmann Guest
|
Posted: Sat Oct 08, 2005 8:40 am Post subject: Re: Uhr mit genauerer Auflösung |
|
|
Hallo Gentoopower,
| Quote: | Ich benötige eine Zeitfunktion, die mir eine genauere Auflösung bringt
als die time() funktion, die ja nur mit einer Genauigkeit von 1s arbeitet.
Ich benötige ca 1ms Genauigkeit.
|
Ich arbeite nun schon seit langem mit folgendem Codeschnippsel. Sollte
auf allen heute verbreiteten Betriebssystemen ein Ergebnis liefern:
#if defined(__glut_h__)
/// @return the number of milliseconds since program start.
#include <stdint.h>
inline uint32_t timeGetTime()
{
return glutGet(static_cast<GLenum>(GLUT_ELAPSED_TIME));
}
#elif defined(__unix__)
#include <stdint.h>
#include <sys/timeb.h>
/// @return a number which is incremented every millisecond.
inline uint32_t timeGetTime()
{
struct timeb t;
ftime(&t);
return (t.time&0xfffff)*1000 + t.millitm;
}
#elif defined(_WIN32)
#include <mmsystem.h>
#else
#error unknown platform. Can not provide timeGetTime()
#endif
--
---> Dirk Jagdmann ^ doj / cubic
----> http://cubic.org/~doj
-----> http://llg.cubic.org
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Dirk Clemens Guest
|
Posted: Sat Oct 08, 2005 10:28 pm Post subject: Re: Uhr mit genauerer Auflösung |
|
|
Richard wrote:
| Quote: | Stefan Ram wrote:
Stimmt time() kann das sogar, habs gerade in der MSDN nachgelesen:
struct __timeb64 tstruct;
_ftime64( &tstruct );
printf( "milliseconds:ttt%un", tstruct.millitm );
|
Vorsicht: Die Angabe ist zwar in Millisekunden, die
Auflösung aber nur (soweit ich mich erinnere) in 1/18 Sek.
Unter Windows hilft QueryPerformanceCounter() und unter
Linux gettimeofday().
Dirk
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Gentoopower Guest
|
Posted: Sat Oct 08, 2005 11:43 pm Post subject: Re: Uhr mit genauerer Auflösung |
|
|
Dirk Clemens wrote:
| Quote: | Richard wrote:
Stefan Ram wrote:
Stimmt time() kann das sogar, habs gerade in der MSDN nachgelesen:
struct __timeb64 tstruct;
_ftime64( &tstruct );
printf( "milliseconds:ttt%un", tstruct.millitm );
Vorsicht: Die Angabe ist zwar in Millisekunden, die
Auflösung aber nur (soweit ich mich erinnere) in 1/18 Sek.
|
Dann müsste aber die Ausgabe der Zeit in ms um 1/18s springen, sprich
1/18, 2/18, 3/18?
sieht aber nicht so aus, wenn ich meine Messungen mache. Es sei denn der
ms Wert wird irgendwie zufällig errechnet.
Was natürlich zutrifft ist, dass die Zeit in ms nie wirklich korrekt
sein wird, da ja durch scheduling/preemption das ganze beeinflusst wird,
aber für meine Zwecke sollte es ausreichend sein.
| Quote: |
Unter Windows hilft QueryPerformanceCounter() und unter
Linux gettimeofday().
|
Sollte mir obige Genauigkeit nicht reichen, so werde ich wohl zusatzlich
rtdsc instruction nutzen, aber ich denke nicht, dass das der Fall sein wird.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Erik G. Guest
|
Posted: Thu Oct 13, 2005 4:00 pm Post subject: Re: Uhr mit genauerer Aufl366sungn^ |
|
|
Hi,
| Quote: | Unter Windows hilft QueryPerformanceCounter() und unter
Linux gettimeofday().
Sollte mir obige Genauigkeit nicht reichen, so werde ich wohl zusatzlich
rtdsc instruction nutzen, aber ich denke nicht, dass das der Fall sein
wird.
|
Also das mit dem RDTSC würd ich lassen, in einem Dual-CPU-PC (Single-CPU
soll ja im PC-Bereich aussterben) werden die TSCs wohl kaum syncron laufen
(die einzelnen CPU-Kerne werden vom BIOS/OS zu unterschiedlichen Zeitpunkten
in Betrieb genommen) und unterschiedliche CPU-Tacke (im klassischen
Multi-Sockel-System) sind ja auch nicht verboten (hab ich schon mit eigenen
Augen funktionierend gesehen). Wenn Du schon was Platfomabhängiges machen
willst dann wende Dich an das verwendete OS, es stellt Dir bestimmt
geeignete Methoden mit hoher Genauigkeit zur Verfügung.
Grüße
Erik
PS.
Ich hab mal auf einem 4fach PentiumPRO versucht mehrere Threads zum exact
gleichen Zeitpunkt auf eine Resource zugreifen zu lassen (als Härtetest für
eine Critical-Section-Implementierung) und hab mich dafür an den TSC gewand.
Es war ein ganz schöner Aufwand zu ermitteln welcher TSC zu welcher CPU
gehört und dehren Verschiebungen untereinander zu errechnen.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|