Seite 1 von 1

Wie sehr kurze Zeiten Messen?

Verfasst: 29.07.2008 06:48
von moin
Hallo,
wie kann man die Rechenzeit eines Programms messen, wenn es so kurz ist, dass ElapsedMilliseconds() meist nur 0ms zurückgibt?
Die Suche in den Foren hat mir nicht weitergeholfen (vielleicht auch nur unter dem falschen Stichwort gesucht :cry: ).
moin

Verfasst: 29.07.2008 07:15
von Helle
Kann man so machen:

Code: Alles auswählen

Global Freq.q
Global Start.q
Global Ende.q
Global Zeit.d 

SetThreadAffinityMask_(GetCurrentThread_(), 1)   ;Thread nur von Core0 ausführen lassen
QueryPerformanceFrequency_(@Freq)
QueryPerformanceCounter_(@Start)

;hier eine Schleife als "Testcode"
For i = 1 To 1000
  j = i * i
Next 

;SetThreadAffinityMask_(GetCurrentThread_(), 1)   ;Werte wieder von Core0 auslesen lassen, nur bei Bedarf einfügen
QueryPerformanceCounter_(@Ende) 
Zeit = (Ende - Start) / Freq

MessageRequester("Verbratene Zeit", StrD(Zeit)+" s")


Zeit=ElapsedMilliseconds()
For i = 1 To 1000
  j = i * i
Next 
Zeit=ElapsedMilliseconds()-Zeit

MessageRequester("Verbratene Zeit", StrD(Zeit)+" ms")
Bei Multi-Core-Systemen unbedingt den Core festlegen!

Gruß
Helle

Verfasst: 29.07.2008 08:37
von Kaeru Gaman
eine gängige Methode ist auch,
den performancekritischen Teil in einer Schleife sehr oft ablaufen zu lassen.
Meßwerte im Bereich von 20-70 sekunden sind aussagekräftiger,
auch feine Unterschiede lassen sich so leichter ermitteln.

Verfasst: 29.07.2008 19:05
von Helle
Na ja, Kurzzeit-Messungen werden nicht nur für Testschleifen benötigt...
Die Auflösung von ElapsedMilliseconds() kann man auf seinem PC übrigens mit folgendem Code ermitteln:

Code: Alles auswählen

Global TimeAdjustment .l               ;Werte in 100-er ns
Global TimeIncrement.l
Global TimeAdjustmentDisabled.l        ;Boolescher Wert
Global Ausgabe.f

GetSystemTimeAdjustment_(@TimeAdjustment , @TimeIncrement, @TimeAdjustmentDisabled)

Ausgabe = TimeAdjustment / 10000       ;so Wert in ms

MessageRequester("Auflösung von ElapsedMilliseconds()", "Beträgt auf diesem PC "+StrF(Ausgabe)+" ms")
Die mit ElapsedMilliseconds() ermittelten Zeiten sind immer (gerundete) Vielfache des ermittelten Wertes.

Gruß
Helle