Vielleicht gibt das ein bisschen Aufschluss:
Code: Alles auswählen
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
Global freq_mic.d
Global freq_mil.d
Define freq.q
QueryPerformanceFrequency_(@freq)
freq_mil = freq / 1000.0
freq_mic = freq / 1000000.0
Procedure.q MillisecondsQ()
Static prev_time_mil.q
Protected cur_time.q
QueryPerformanceCounter_(@cur_time)
If cur_time > prev_time_mil
prev_time_mil = cur_time
ProcedureReturn(cur_time/freq_mil)
Else
ProcedureReturn(prev_time_mil/freq_mil)
EndIf
EndProcedure
Procedure.q MicrosecondsQ()
Static prev_time_mic.q
Protected cur_time.q
QueryPerformanceCounter_(@cur_time)
If cur_time > prev_time_mic
prev_time_mic = cur_time
ProcedureReturn(cur_time/freq_mic)
Else
ProcedureReturn(prev_time_mic/freq_mic)
EndIf
EndProcedure
CompilerElse
Structure timeval
tv_sec.i
tv_usec.i
EndStructure
Procedure.q MillisecondsQ()
Protected time.timeval
gettimeofday_(@time,#Null)
ProcedureReturn((time\tv_sec*1000000 + time\tv_usec)/1000)
EndProcedure
Procedure.q MicrosecondsQ()
Protected time.timeval
gettimeofday_(@time,#Null)
ProcedureReturn(time\tv_sec*1000000 + time\tv_usec)
EndProcedure
CompilerEndIf
OpenConsole()
For x = 1 To 1000
PrintN(Str(ElapsedMilliseconds()))
PrintN(Str(MillisecondsQ()))
PrintN(Str(MicrosecondsQ()))
Next
Ergebnis Linux (Auszug) farbig hervorgehoben:
456
1383862316456
1383862316456980
456
1383862316457
1383862316457020
457
1383862316457
1383862316457022
457
1383862316457
1383862316457024
Der kleine Wert ist der von PB. Schaut also so aus als ob hier die Sekunden und die Microsekunden fehlen. Die Sekunden wären zu groß für einen 4 Byte großen Rückgabewert und die Microsekunden wären um 3 Stellen zu genau. Ich hoffe nur daß hier PB den Umbruch richtig hinkriegt

. Ich bin mir übrigens ziemlich sicher daß PB gettimeofday verwendet weil in einem meiner Source-Ordner in dem auch einige C files rumliegen verdächtig viele PB-binaries gefunden werden wenn ich nach gettimeofday greppe.
Auf Windows sieht der Auszug hingegen so aus:
3695320
3695612
3695612322
3695320
3695612
3695612331
3695320
3695612
3695612345
3695320
3695612
3695612360
Da ist mir die Differenz zu groß als daß ich davon ausgehen würde daß hier QueryPerformanceCounter verwendet würde. Insbesondere wenn ich das Ergebnis mit dem nicht so genauen GetTickCount() vergleiche bin ich mir sicher daß ElapsedMilliseconds() unter Windows GetTickCount() verwendet (und das gibt halt nun mal lediglich 4 byte großen Wert zurück).
Meine Schlussfolgerung: Damit auf allen Systemen so 'n popeliger 4 byte großer Timer funzt muss man in Linux erst mal bissl rumschnippeln. Aber es dient einem guten Zweck... vermutlich... hoffentlich
