精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>C/C++>>技术精解:内存、进程、线程等>>Re:在BCB中如何获取CPU的外频?如何识别是奔腾还是赛扬?

主题:Re:在BCB中如何获取CPU的外频?如何识别是奔腾还是赛扬?
发信人: szbug(深圳虫)
整理人: wenbobo(2003-08-23 11:08:06), 站内信件
【 在 lynch_9624 的大作中提到:】
:GetSystemInfo 在bcb里面有么?
:......
GetSystemInfo只能获取CPU的类型,不能获取CPU的频率。
说到检测CPU的速度,一般是测试在单位时间内运算的指令条数,但用这种方法有太大的局限性,由于受到很多因素的影响,准确度比较低,特别是在Windows环境下,你不知道在你的程序外别的程序占用了多少的时间片。其实,在586及以上档次处理器中,已经有了一条专用的指令来测试主频,那就是 RDTSC指令,意思是读取时间标记计数器,是处理器内部的一个64位的MSR (model specific register),它每个时钟增加一个记数。在处理器复位的时候,初始值为0,RDTSC 指令把 TSC的值低32位装入EAX中,高32位装入EDX中。如果CPU的主频是200MHz,那么在一秒钟内,TSC的值增加 200.000.000次。所以在计算的时候,把两次的TSC差值除以两次的时间差值就是CPU的主频。程序的结构如下: 初始化的时候设置一个定时器,定时时间为1秒,然后在定时器消息中利用 RDTSC 取得 TSC计数,再和上次保留的值相减,然后除以时间差即可。
bcb OK
#prgram inline
void __fastcall TForm1::Button1Click(TObject *Sender)
{

     DWORD eax1,edx1,eax2,edx2;
   asm
   {
      rdtsc
      mov eax1,eax
      mov edx1,edx
   }
   Sleep(1000);
   asm{
     rdtsc
     mov eax2,eax
     mov edx2,edx
    }

   eax2-=eax1;
   edx2-=edx1;

   edx2*=2147483647;
   edx2+=eax2;
   Label2->Caption=IntToStr(edx2);
}


----
深圳赛格6546
我是一条虫,来自深圳。  

I like rc model. 
免费的动态域名解析  

[关闭][返回]