brauche groessere aufloesung bei GetProcessTimes
-
hi,
ueberschrift sagt alles.
ich habe einen prozess, der berechnungen ausfuehrt und am ende seine kerneltime+usertime in eine datei schreibt. manchmal braucht die berechnung einige sekunden, aber all zu oft weniger als 10ms (die aufloesung von GetProcessTimes).
ich habe irgendwo im netz auf einer seite gesehen, dass man die aufloesung fuer Sleep() mit einem API call von 10ms auf 1ms runterdruecken kann. vielleicht funktioniert das auch mit GetProcessTimes (reine vermutung).
jedenfalls moechte ich die ausfuehrungszeiten dieses prozesses messen und das wie gesagt fuer <10ms. der prozess laeuft auf normaler prioritaet und parallel laufen auch andere prozesse mit gewisser last. GetTickCount() wuerde deshalb verfaelschte differenzen angeben.
"rdtsc" habe ich verworfen, weil das eine Pentium-geschichte ist und ich einen AMD Athlon habe.
hab schon die boardsuche benutzt, wobei kaum ergebnisse kamen. hab das board auch mit google besucht und auch generell gesucht.
was kann ich machen?
-
"rdtsc" habe ich verworfen, weil das eine Pentium-geschichte ist und ich einen AMD Athlon habe.
lol die sind doch kompatibel.
-
den hab ich ausserdem verworfen, weil ich die eigentliche ausfuehrungszeit und nicht die verstrichene zeit brauche.
soweit ich weiss, sind die nur zum 80386 kompatibel.
-
Darf ich mal fragen, wie du darauf kommst, dass GetProcessTimes zu grob auflöst?
All times are expressed using FILETIME data structures. Such a structure contains two 32-bit values that combine to form a 64-bit count of 100-nanosecond time units.
Daran dürfte es doch eigentlich nicht liegen.
btw:
rdtsc ist x86 kompatibel, was sowohl für Pentium als auch AMD zutrifft.
-
groovemaster schrieb:
rdtsc ist x86 kompatibel, was sowohl für Pentium als auch AMD zutrifft.
es funktioiniert ab pentium. also nicht auf 80386 oder 80486. naja, sowas hat ja keiner mehr. auf allen ab pentium und auf allen modernen amd-clones, cyrix-geschichten und via-scherzen geht rdtsc.
-
weil ich die eigentliche ausfuehrungszeit und nicht die verstrichene zeit brauche.
rdtsc
SpeichernAnweisungen
rdtscZeit_aus_dieser_messung-Zeit_aus_vorheriger_messung=Ausführungszeit

Man kann vorher auch sowas versuchen:timeBeginPeriod(1) - Setzt die Timerauflösung näheres siehe MSDN
-
mit queryperformancecounter bekomme ich ausreichend aufloesung (~3.6MHz).
GetProcessTimes loest nur theoretisch auf 100ns auf. praktisch sind es in etwa vielfache von 10ms (nicht genau), bedingt durch die groesse der timeslices auf NT (mutmassung).
ich benutze jetzt GetProcessTimes() fuer grobe zeiten und fuer alles, was dann als <20ms gemeldet wird, nehm ich den performancecounter.
auch wenn der nicht die ausfuehrungszeit des prozesses ausgibt, ab <10ms machts auch nichts mehr aus, weil eh alles in einer zeitscheibe ablaeuft (interrupts nicht beachtet).