Page 1 of 2
CPU SPEED
Posted: Sat Dec 30, 2006 7:07 pm
by NoahPhense
I know this topic has been hit A LOT of times. But I need to address it
again. Here is some code: (questions below)
Code: Select all
Procedure.l GetCpuMhz()
Global int64val.LARGE_INTEGER
!FINIT
!rdtsc
!MOV dword [v_int64val+4],Edx
!MOV dword [v_int64val],Eax
!FILD qword [v_int64val]
Delay(1000)
!rdtsc
!MOV dword [v_int64val+4],Edx
!MOV dword [v_int64val],Eax
!FILD qword [v_int64val]
!FSUBR st1,st0
int64val\highpart=0
int64val\lowpart=1000000
!FILD qword [v_int64val]
!FDIVR st0,st2
!fistp qword [v_int64val]
ProcedureReturn int64val\lowpart
EndProcedure
; MessageBox_(0, Str(GetCpuMhz()*2), "CPU Speed", #MB_ICONINFORMATION)
Debug GetCpuMhz()*2
Delay(1000)
Debug GetCpuMhz()*2
Delay(1000)
Debug GetCpuMhz()*2
Delay(1000)
Debug GetCpuMhz()*2
End
I don't get steady results on every run. Is there something better?
Are there different formulas out there for calculations?
Like:
- grabbing cpu speed from bios
- grebbing cpu speed from windows
- realtime calculation
- np
Posted: Sat Dec 30, 2006 7:31 pm
by Trond
Posted: Sat Dec 30, 2006 7:46 pm
by NoahPhense
That's interesting. But it doesn't help with laptops that control processor
speeds.
I need an accurate realtime processor speed.
- np
Posted: Sat Dec 30, 2006 7:49 pm
by netmaestro
Getting the CPU speed from the registry is safest. Code similar to the proc you posted won't give reliable results on multicore machines, but if you look at the registry key
HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\SYSTEM\CentralProcessor\0
you will get good information. Then you can check
HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\SYSTEM\CentralProcessor\1
to see if there's another core.
Posted: Sat Dec 30, 2006 8:24 pm
by Trond
First of all, you probably don't. Second, if you use the processor the speed may change.
This gives the correct result here, but it's not perfectly accurate.
Code: Select all
Procedure.q GetCycleCount()
!rdtsc
ProcedureReturn
EndProcedure
Procedure CpuSpeed()
Protected A.q
Protected B.q
A = GetCycleCount()
Sleep_(100)
B = GetCycleCount()
ProcedureReturn (B-A) / 100000
EndProcedure
Debug CpuSpeed()
Obviously the longer you wait, the more accurate.
Posted: Mon Jan 01, 2007 4:15 pm
by TerryHough
@NoahPhense
Did you review topic
http://www.purebasic.fr/english/viewtopic.php?t=3811 ?
I hadn't looked at this since 2003, but the routine I use is based on the topic above and seems to be very consistent. (Jack's version)
For example, 20 sequential checks on this machine all indicate 1784 Mhz.
The registry reports 1785 Mhz, and the My Computer properties indicate 1.79 Ghz.
Posted: Mon Jan 01, 2007 4:37 pm
by netmaestro
This should be as accurate as any:
Code: Select all
Procedure GetCPUSpeed()
QueryPerformanceFrequency_(@ulFreq.q)
ProcedureReturn ulFreq/1000000
EndProcedure
Debug GetCPUSpeed()
Posted: Mon Jan 01, 2007 6:49 pm
by akj
Netmaestro's code does not work on my 300MHz PC as it returns a value of 1.
Here's another routine that does work for me:
Code: Select all
Procedure.l CpuSpeed()
; Returns CPU speed in MHz
Protected A.q, B.q
!RDTSC
!MOV dword [p.v_A+4],Edx ; A hi
!MOV dword [p.v_A],Eax ; A lo
Sleep_(100)
!RDTSC
!MOV dword [p.v_B+4],Edx ; B hi
!MOV dword [p.v_B],Eax ; B lo
ProcedureReturn (B-A)/100000
EndProcedure
Posted: Mon Jan 01, 2007 6:57 pm
by netmaestro
Some older processors don't support QueryPerformanceFrequency, for those it won't work, true enough.
Posted: Tue Jan 02, 2007 3:07 am
by Azul
netmaestro wrote:Some older processors don't support QueryPerformanceFrequency, for those it won't work, true enough.
How new it should be?
I got '3' with AMD Athlon(tm) XP 2400+ (2GHz)
update: WinXP SP2
Posted: Tue Jan 02, 2007 3:19 am
by netmaestro
Not sure about specific hardware, which configurations support high-resolution frequency counters and which don't, but when you do:
Code: Select all
Result = QueryPerformanceFrequency_(@ulFreq.q)
if you find a non-zero value in Result, the high-resolution frequency counter is supported by your hardware, if it's zero your hardware doesn't support it. I'm not too strong in hardware, so the support for this could be coming from the motherboard / bios rather than the processor, I dunno. If somebody knows, a post would be appreciated.
Posted: Tue Jan 02, 2007 3:48 am
by CadeX
netmaestro wrote:Some older processors don't support QueryPerformanceFrequency, for those it won't work, true enough.
My processor is quite insulted by that, seeing as its an AMD 64bx2 2.2GHZ Core processor. Amd Hammer Family, That is not old.
I also get a "3" returned.
I did notice that everyone with issues of that code has an AMD.
Posted: Tue Jan 02, 2007 12:53 pm
by Derek
I got 1862 with my dual core core2 which runs at 1.86 per core, but as was mentioned, it's not an AMD.
Posted: Tue Jan 02, 2007 1:55 pm
by Flype
netmaestro wrote:Some older processors don't support QueryPerformanceFrequency, for those it won't work, true enough.
i have AMD AthlonXP 2800+ (2.08 Ghz) and QueryPerformanceFrequency returns here 3.
Posted: Tue Jan 02, 2007 2:32 pm
by rsts
Of those posted, Trond's give 1799 on my amd athlon 1.8 and NoahPhense
3600 or 3599.
Neither of the others seem to work properly. netmaestro returns the expected amd 3 and I get an assembler undefined symbol on akj's.
No complaints. just reporting my experience in the interest of science
cheers