CPU的主频,即CPU内核工作的时钟频率(CPU Clock Speed)。CPU的主频表示在CPU内数字脉冲信号震荡的速度。主频和实际的运算速度存在一定的关系,但目前还没有一个确定的公式能够定量两者的数值关系,因为CPU的运算速度还要看CPU的流水线的各方面的性能指标(缓存、指令集,CPU的位数等等)。由于主频并不直接代表运算速度,所以在一定情况下,很可能会出现主频较高的CPU实际运算速度较低的现象。

在windows操作系统中,可以使用右键点击“我的电脑”,查看属性来获取CPU的主频信息,然而该信息是存在于注册表之中的。也就是说可以通过修改注册表来伪造CPU主频信息。那能不能用其它方法获得该信息呢?

检测CPU的速度,一般是测试在单位时间内运算的指令条数,但用这种方法有太大的局限性,由于受到很多因素的影响,准确度比较低,因为你不知道在你的程序外别的程序占用了多少的时间片。其实在586及之后处理器中,已经有了一条专用的指令来测试主频,那就是 RDTSC指令,意思是读取时间标记计数器(Read Time-Stamp Counter),Time-stamp counter 是处理器内部的一个64位的MSR (model specific register),处理器每时钟周期递增时间标签计数器 MSR 一次,在处理器复位时将它重设为 0。RDTSC 指令把 TSC的值低32位装入EAX中,高32位装入EDX中。如果CPU的主频是200MHz,那么在一秒钟内,TSC的值增加 200,000,000 次。所以在计算的时候,把两次的TSC差值除以两次的时间差值就是CPU的主频。

从上面的资料得到了一个思路:首先使用RDTSC指令获取1个TSC的值,将其存储起来,再延时1秒,使用RDTSC指令获取1个新的TSC值,并用其减去第一次获得的TSC值,即可得到该CPU的主频。用C和汇编混合的代码如下:

#include <windows.h>
#include <stdio.h>int main(int argc,char* argv[])
{static int time[2];int quotient = 0; //商int remainder = 0; //余数__asm{rdtsc // read time-stamp countmov ebx,offset time //将time的偏移地址存入ebxmov [ebx+0],edx //把TSC的值的高32位存入[ebx+0]中mov [ebx+4],eax //把TSC的值的低32位存入[ebx+4]中}Sleep(1000);__asm{rdtsc // read time-stamp countmov ecx,offset time //将time的偏移地址存入ecxsub eax,[ecx+4] //把延时1秒后的TSC值的低32位减去1秒前的TSC值的低32位sbb edx,[ecx+0] //把延时1秒后的TSC值的高32位减去1秒前的TSC值的高32位mov ecx,1000000000 //转换成GHzdiv ecxmov quotient,eax //将结果中的商赋值于quotiendmov remainder,edx //将结果中的余数赋值于remainder}remainder = remainder / 10000000; //余数仅保留两位printf("该机主频为:%d.%d",quotient,remainder);return 0;
}

注意:寄存器  CR4  中的时间标签禁用  (TSD)  标志限制  RDTSC  的使用。清除  TSD  标志时, RDTSC  指令可以在任何特权级别执行;设置此标志时,指令只能在特权级别  0  执行。在特权级别  0  执行时,时间标签计数器还可以使用  RDMSR  指令读取。

但是在多核时代,RDTSC 指令的准确度大大削弱了,原因有如下几点:

1. 不能保证同一块主板上每个核的 CPU 时钟周期数(Time Stamp Counter)是同步的;

2. CPU 的时钟频率可能变化,例如笔记本电脑的节能功能;

3. 乱序执行导致 RDTSC 测得的周期数不准。 虽然 RDTSC 废掉了,高精度计时还是有办法的,在 Windows 上用 QueryPerformanceCounter 和 QueryPerformanceFrequency,Linux 上用 POSIX 的 clock_gettime 函数,以 CLOCK_MONOTONIC 参数调用。

在接下来的几篇文章章中,我会继续介绍相关内容。

参考文章:

1、多核时代不宜再用 x86 的 RDTSC 指令测试指令周期和时间

http://blog.csdn.net/solstice/article/details/5196544

2、RDTSC命令详解

http://blog.csdn.net/tbwood/article/details/5536597

编程获得CPU的主频相关推荐

  1. Linux通过编程获取CPU核数

    sysconf( )有unistd.h提供,要使用该函数需要#include<unistd.h>, 其参数可以是 _SC_NPROCESSORS_CONF,也可以是 _SC_NPROCES ...

  2. cpu的主频主要影响微型计算机的,在微型计算机中,通常用主频来描述CPU的(1);对计算机磁盘工作影响最小的因 - 问答库...

    问题: [单选] 在微型计算机中,通常用主频来描述CPU的(1):对计算机磁盘工作影响最小的因素是(2).空白(2)处应选择() A . 温度 B . 湿度 C . 噪声 D . 磁场 某车间需要用一 ...

  3. 详解CPU的主频、核心、线程、缓存、架构

    CPU的重要参数:主频.核心.线程.缓存.架构. 1.主频: 在CPU的参数里的 3.0GHz.3.7GHz等就是CPU的主频,严谨的说他是CPU内核的时钟频率,可直接理解为运算速度. CPU的主频相 ...

  4. 如何获取CPU的主频和使用率?

    最近看到论坛中有人需要在Java端读取系统的CPU主频和使用率,在网上搜索了一下,发现了一些有用的东西,就在这总结一下. 一.获得CPU的主频 1.从注册表中读取 在注册表中键HKLM/HARDWAR ...

  5. CPU的主频/核心数

    转载:https://baijiahao.baidu.com/s?id=1615669643158261053&wfr=spider&for=pc CPU的主频 我们知道CPU主要是用 ...

  6. cpu的主频、外频和倍频

    先以AMD的cpu为例, 看一张图: 主频, 外频, 倍频的关系, 显而易见. 那他们都是什么意思呢? 外频是电脑主板上的一个石英振荡器的震荡频率, 产生电脉冲信号, 这就是电脑的系统时钟频率. 而C ...

  7. 计算机cpu的主频参数,电脑CPU的参数怎么看?原来这么简单!

    众所周知,CPU和我们人类的大脑一样,是指挥其他硬件工作的中枢.而性能越好的CPU,往往就能带来更加流畅.高效的使用体验. 当我们在选择CPU的时候,主要看架构.主频.核心.线程等参数.极客兄就用超简 ...

  8. mysql要求cpu主频还是核数_CPU主频和核数哪个更重要?电脑CPU到底主频高好还是多核好?...

    装机选购CPU无疑是重中之重,相当于人类的大脑,它决定了电脑运算的速度.对于DIY老鸟来说,一般会从架构.核心.主频等方面衡量一颗CPU好坏,这也是CPU性能的核心三要素.在相代相同架构的处理器,自然 ...

  9. CPU「主频」是什么,有哪些限制条件,对于 CPU 性能的影响有哪些?

    今天我来讲一下「主频」是什么,有哪些限制条件,对于 CPU 性能有哪些影响. 首先:CPU 的主频是什么? CPU的主频,即CPU内核工作的时钟频率(CPU Clock Speed).通常所说的某某C ...

最新文章

  1. qfdw.xyz sq.php,GitHub - STORMSQ/sqphp: 練習用框架,使用PHP搭建
  2. 你以为A10 Networks只做应用交付?
  3. C 常用新特性(下)
  4. [随笔重写] Python3 的深拷贝与浅拷贝
  5. 关闭linux系统中读写页缓存,Linux文件系统FAQ
  6. C++工程师面试题大全
  7. jboss7.1.安装配置
  8. idea--Project Structure
  9. mysql数据库比较,各数据库不同之处
  10. 【论文笔记】PTE:预测性文本嵌入
  11. mysql bat备份_Windows下简单的Mysql备份BAT脚本分享
  12. 从键盘输入若干个学生成绩,计算出平均成绩。
  13. NOI国家集训队论文分类整理
  14. 聊聊在小米实习的日子
  15. PyQt之QSS美化
  16. 学python为何不好找工作呢?
  17. 做前端开发拿 30W 年薪很难吗?
  18. Asymmetric numeral systems (ANS)非对称数字系统最全资料整理
  19. TypeScript中any、unknown、void、never类型讲解
  20. java合成两张图片并在图片上写字

热门文章

  1. 孕期饮食新理念——初光孕妇餐 让孕期营养更科学
  2. oracle如何添加小数点,Oracle处理保留小数点
  3. 【系统篇 / 文件】01. 文件服务安装与配置 ❀ Windows Server 2008 R2
  4. PADS的layout单个元器件删除时提示“复用元素无法修改,首先打散复用模块”
  5. 保姆级高通AEC9调试指南(看完可解决80%AE相关问题)
  6. 初见Python与对未来的展望
  7. 星球乐园 | 害怕水逆是因为你已经很久没有读完一本书
  8. Thymeleaf 教程:使用Thymeleaf[转自官方]
  9. 日更100天(33)每天进步一点点
  10. 官宣:传智播客品牌全新升级为「传智教育」