Seite 1 von 3
Taktfrequenz der CPU berechnen ...
Verfasst: 11.03.2005 23:38
von DarkCrow
Hallo Leute,
da ich noch relativer PureBasic-Noob bin wollt ich fragen, was ihr bei diesem Code noch ändern würdet, damit er besser läuft ...
... bei mir läuft er, bei meinem Freund nicht
EDIT: So jetzt funktionierts mit dieser Prozedur
Code: Alles auswählen
Procedure.l CalcCPUSpeed()
DelayTime = 500
TimerHi = 0
TimerLo = 0
PriorityClass = GetPriorityClass_(GetCurrentProcess_())
Priority = GetThreadPriority_(GetCurrentThread_())
SetPriorityClass_(GetCurrentProcess_(),100)
SetThreadPriority_(GetCurrentThread_(),15)
Sleep_(10)
!CPUID
!DW 310Fh ; rdtsc
MOV TimerLo, EAX
MOV TimerHi, EDX
Sleep_(DelayTime)
!CPUID
!DW 310Fh
SUB EAX, TimerLo
SUB EDX, TimerHi
MOV TimerLo, EAX
MOV TimerHi, EDX
SetPriorityClass_(GetCurrentProcess_(),Priority)
SetThreadPriority_(GetCurrentThread_(),PriorityClass)
ProcedureReturn (TimerLo / (1000.0 * DelayTime))
EndProcedure
Verfasst: 12.03.2005 09:51
von Leo
Ich kann dir zwar bei dem Problem nich helfen, aber ein kleiner Tipp: Die ganzen Api Befehle sind von PureBasic schon definiert. Du musst nur einen kleinen Bindestrich hintendrann setzen, also zum Beispiel: GetCurrentProcess_()
Verfasst: 12.03.2005 09:52
von MVXA
und wenn er die Demo hat, bzw. die APIs noch nicht von Fred eingebunden wurden? Gibt es -_-.
Verfasst: 12.03.2005 09:56
von Leo
Verfasst: 12.03.2005 10:10
von brotkasten-deluxe
es gibt doch ne lib wo dieser befehl drinne is .... oO nur ich weis grad nicht wo

Verfasst: 12.03.2005 11:07
von DarkDragon
Genau das selbe hat doch irgendjemand hier schonmal in einer Prozedur gehabt. Nur weiß ich nichtmehr wer. Such mal ein wenig hier und im Archiv.
Verfasst: 12.03.2005 12:58
von DarkCrow
MVXA hat geschrieben:und wenn er die Demo hat, bzw. die APIs noch nicht von Fred eingebunden wurden? Gibt es -_-.
Also ich hab die gekaufte Version ... aber was sind die "APIs von Fred"?
Verfasst: 12.03.2005 13:02
von Kaeru Gaman
MVXA hat geschrieben:und wenn er die Demo hat, bzw. die APIs noch nicht von Fred eingebunden wurden? Gibt es -_-.

Verfasst: 12.03.2005 18:25
von Froggerprogger
Hi!
...hab mich da jetzt auch mal rangesetzt und eine Procedure gebastelt:
(ist wieder mal ein gefundes Fressen, ASM zu vertiefen)
GetProcessorGHz(waitMs.l) liefert einen Float zurück, der die Geschwindigkeit der CPU in GHz wiedergibt. Dabei kann die Dauer des Tests eingestellt werden, "ein paar 100" ms sollten es aber schon sein, bei allem unter 100ms wird es bei mir zumindest sehr ungenau.
[edit] update auf 'härtere Bandagen' [/edit]
Code: Alles auswählen
; ghz.f = GetProcessorGHz(waitMs.l)
; returns to get the processors speed and uses waitMs Milliseconds
; for the calculation. (values >= 500 should give an accurate result)
; by Froggerprogger 12.03.05
Procedure.f GetProcessorGHz(waitMs.l)
Protected Hi.l, Lo.l
SetPriorityClass_(GetCurrentProcess_(),#REALTIME_PRIORITY_CLASS) ; switching to realtime priority
Sleep_(0) ; wait for new time-slice
!RDTSC ; load the proc's timestamp to eax & edx
!MOV [esp+8], eax ; store eax to Lo
!MOV [esp+4], edx ; store edx to Hi
Sleep_(waitMs) ; wait for waitMs ms
!RDTSC ; load the proc's timestamp to eax & edx
!SUB eax, [esp+8] ; subtract Lo from eax
!SBB edx, [esp+4] ; subtract Hi from edx incl. carrybit
!MOV ecx, dword 1000 ; store 1000 to ecx
!DIV ecx ; divide edx & eax by ecx and store result in eax
!MOV [esp+8], eax ; copy result to Lo
SetPriorityClass_(GetCurrentProcess_(),#NORMAL_PRIORITY_CLASS) ; switching back to normal priority
ProcedureReturn Lo / (1000.0 * waitMs)
EndProcedure
MessageRequester("","Processorspeed is " + StrF(GetProcessorGHz(1000), 4) + " GHz")
Verfasst: 12.03.2005 22:37
von Laurin
@Froggerprogger:
Dein Test ist sehr ungenau, was mein System angeht. Ich habe einen AMD mit Cool'n'Quite, da taket er im Leerlauf immer auf 1 Ghz runter und in Vollast auf 2,2 Ghz.
Dein Code zeigt immer ein Ergebnis zwischen 1,7 und 2 Ghz.