Wie sehr kurze Zeiten Messen?

Anfängerfragen zum Programmieren mit PureBasic.
moin
Beiträge: 59
Registriert: 03.07.2007 08:38
Wohnort: Norddeutschland

Wie sehr kurze Zeiten Messen?

Beitrag 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
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Beitrag 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Beitrag 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
Antworten