VC++6での使用です。
レジストリの
HKLM\HARDWARE\DESCRIPTION\System\CentralProcessor
に~MHzというのがあります。
それを読めばいいと思います。
http://www.kt.rim.or.jp/~yuta/prog/win32/Name/sys_ver.html
くえーさん
ありがとうございます。
でも、このレジストリの値の取得って、
fopenして、fgetcとかで出来るんでしょうか?
それとも、ご指摘のサイトに書いてあるような
GetVersionEx
で行うとか?
ちょっと、値を読むシーケンスがわからなかったので、
お聞きしました。
計測するなら、こんな方法もありますよ。
int cpu_clk(){
__int64 c1 = 0, c2 = 0;
DWORD flag, mask = 0x10;
DWORD wait = 100;
DWORD time;
__asm{
mov eax, 01H;
cpuid;
mov flag, edx;
}
if(flag & mask){ // rdtsc 命令のサポートチェック
time = GetTickCount() + wait();
__asm{
rdtsc; // 電源投入時からのクロックのカウント数
mov dword ptr[c1], eax;
mov dword ptr[c1+4], edx;
}
while(time > GetTickCount()); // 0.1秒待つ
__asm{
rdtsc;
mov dword ptr[c2], eax;
mov dword ptr[c2+4], edx;
}
}
return int((c2 - c1) / wait / 1000); // [MHz]にするため1000で割る
}
[GHz]位なら、0.1秒位で十分だと思いますが、もう少し低いクロックを計るなら、waitを大き
くしたほうが良いと思います。
while(time > GetTickCount()); の部分を Sleep にしても出来ますが、ノートパソコンの場
合、負荷をかけないとうまく測定できないみたいです。
> でも、このレジストリの値の取得って、
> fopenして、fgetcとかで出来るんでしょうか?
ファイルとしてアクセスするわけではないので、Cの標準関数では無理です。
> ちょっと、値を読むシーケンスがわからなかったので、
> お聞きしました。
Win32SDKなのか、MFCなのかで微妙に変わると思われますが…
RegOpenKeyEx()/RegQueryValueEx()/RegCloseKey()等でしょうか。
ググるとそれなりにみつかると思います。
訂正です。
__int64 c1, c2 → unsigned __int64 c1, c2
ごめんなさいもう一個訂正
GetTickCount() + wait(); → GetTickCount() + wait;