玩转CPU之直线
近期在看编程之美,看到第一个问题时,一下子就被吸引了,原来在windows 的任务管理器中还能够让CPU舞动起来,再一次的相信了编程中仅仅有想不到没有做不到,对于书中的做法和网上的实现大致都同样。只是在看后面的解法之前,我的解法和书中第一种简单的控制之法同样,并且我还引入了一个实时监測CPU主频的函数。能够移植到其它的PC上。
#include <windows.h>
#include <iostream> using namespace std; int size = 0; int getCPUFrequency()
{
static int time[2]; //定义一个整型数组time
int a = 0; //定义整形变量a=0(在后面的运算中用来存商)
int b = 0; //定义整形变量b=0(在后面的运算中用来存余数) __asm{
rdtsc //RDTSC指令,意思是读取时间标记计数器(Read Time-Stamp Counter)
mov ecx,offset time //将time的偏移地址存入ecx
mov [ecx+0],edx //把TSC的值的高32位存入[ecx+0]中
mov [ecx+4],eax //把TSC的值的低32位存入[ecx+4]中
} Sleep(1000); //延时1秒 __asm{
rdtsc
mov ebx,offset time //将time的偏移地址存入ebx
sub eax,[ebx+4] //把延时1秒后的TSC值的高32位减去1秒前的TSC值的高32位
sbb edx,[ebx+0] //把延时1秒后的TSC值的低32位减去1秒前的TSC值的低32位
mov ecx,1000000000
div ecx //将2次TSC差值除以1,000,000,000
mov a,eax //将结果中的商赋值于a
mov b,edx //将结果中的余数赋值于b
} b=b/10000000; //取余数中的最高2位 printf("该机CPU主频是: %d.%dGHz\n",a,b); //打印结果 return a*1000+b*10;
} int main()
{
size = getCPUFrequency()*2/5*1000000;// 解释第一点
size -= 100000;//解释第二点
while(1)
{
for(int i=0; i < size; i++)
;
Sleep(10);//解释第三点
}
return 0;
}
如今来解释第一点:现代CPU每一个时钟周期能够运行两条以上的代码。取平均值就是2。CPU的主频表示1秒运行加法的次数,对于除以5的运算,由于在底层的加法实现中。CPU要进行5次运算才干够进行一次加法运算。
next:
mov eax, dword ptr[i]; 将i 的值放入寄存器
add eax, 1; 寄存器加1
mov dword ptr[i], eax; 寄存器赋值回i
cmp eax, dword ptr[n]; 比較i 和 n
jl next; 小于n 则继续运行
解释第二点:上述讨论的情况都是在理想的情况下,就是考虑CPU仅仅执行当前这一个程序。而实际中CPU还会花时间执行其它的程序。所以在执行这个程序时须要将执行的次数适当的降低,至于降低的数量依当前OS的执行进程而定。
解释第三点:至于CPU的睡眠时间。10ms 是接近windows的调度时间片。
如今的电脑非常难看到单核的CPU了所以在程序的执行过程中在windows的任务管理器中的进程模块中找到程序的执行号,点击鼠标右键,设置相关性,将此执行的程序用一个CPU核心来执行
玩转CPU之直线的更多相关文章
- 深入理解 Linux Cgroup 系列(二):玩转 CPU
原文链接:深入理解 Linux Cgroup 系列(二):玩转 CPU 上篇文章主要介绍了 cgroup 的一些基本概念,包括其在 CentOS 系统中的默认设置和控制工具,并以 CPU 为例阐述 c ...
- 玩转CPU运行曲线
Leaf 是不是从来没有想过看看cpu运行曲线啊骚年?顶多也就仅仅是看看cpu利用率,吓自己一跳后感觉关闭几个不该打开的程序~ 然而问题来了,微软公司要让你绘制cpu运行曲线啊!!不仅是固定的直线,还 ...
- 软硬件协同编程 - C#玩转CPU高速缓存(附示例)
写在前面 好久没有写博客了,一直在不断地探索响应式DDD,又get到了很多新知识,解惑了很多老问题,最近读了Martin Fowler大师一篇非常精彩的博客The LMAX Architecture, ...
- 让CPU的占有率曲线听我指挥
最近我要在公司的一个study group负责AWS的AutoScaling功能的介绍.AWS可以根据instance(虚拟机)的CPU使用量进行scaling. 为了做demo,于是就有这样一个需求 ...
- 《编程之美》学习笔记——指挥CPU占用率
问题: 写一个程序.让用户来决定Windows任务管理器(Task Manager)的CPU占用率(单核). 有下面几种情况: 1.CPU占用率固定在50%,为一条直线 2.CPU的占用率为一条直线, ...
- 浅析 Pycharm 内存、cpu 占用率
浅析 Pycharm 内存.cpu 占用率 本机配置参数: ------------------------------------------ Windows 10 专业版 X64 ----- ...
- CPU相关的学习
我理解的CPU 目前对cpu的了解停留在这个水平 查看CPU型号: cat /proc/cpuinfo |grep model |tail -n 1 model name : Intel(R) Xeo ...
- NVIDIA显卡设置提升MineCraft流畅度
很喜欢MineCraft(我的世界)这款游戏.可09年Y450的配置现在看来有点弱,尽管将Y450的CPU升级至了2.8Ghz的T9600,内存升级至1066Mhz的4G双通道内存,硬盘更换为128G ...
- 如何扩展分布式日志组件(Exceptionless)的Webhook事件通知类型?
写在前面 从上一篇博客高并发.低延迟之C#玩转CPU高速缓存(附示例)到现在又有几个月没写博客了,啥也不说,变得越来越懒了,懒惰产生了拖延后遗症. 最近一周升级了微服务项目使用的分布式日志组件Exce ...
随机推荐
- Xcode 动态库及Framework 安装路径设置
使用Xcode开发动态库及Framework时,需要为其设置Install path.在设置Install path时,可能会使用到以下几个路径: 1)绝对路径: 绝对路径 ...
- CAD实现文档坐标到视区坐标的转换(com接口Delphi语言)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...
- Could not resolve type alias 'map '. Cause: java.lang.ClassNotFoundException: Cannot find class: map
把resultType改为resultMap, 把parameterType改为parameterMap,重新发布并运行.
- Spring Boot 创建hello world项目
Spring Boot 创建hello world项目 1.创建项目 最近在学习Spring Boot,这里记录使用IDEA创建Spring Boot的的过程 在1出勾选,选择2,点击Next 这里填 ...
- 用sed写配置IP脚本参数
#!/bin/bash#配置ip地址参数脚本NET=/etc/sysconfig/network-scripts/ifcfg-ens33if grep -E "BOOTPROTO=dhcp& ...
- linux 下mysql无法启动 mysql.sock
在公司装的一键安装的lnmp环境,启动mysql时候发现mysql.sock不存在, 然后我进行查找 最后在 /usr/local/mysql/bin/mysql_safe 重新启动下 然后启动 ...
- Invalid character found in the request target.The valid characters are defined in RFC 7230 and RFC3986
Tomcat在 7.0.73, 8.0.39, 8.5.7 版本后,添加了对于http头的验证. 具体来说,就是添加了些规则去限制HTTP头的规范性 参考这里 具体来说: org.apache.tom ...
- [Luogu] P3225 [HNOI2012]矿场搭建
题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个挖煤点坍塌之 ...
- IN语句改写EXISTS
-- IN SELECT T1.* FROM role_menu T1 WHERE T1.ROLEUUID IN ( SELECT T2.uuid FROM role T2 WHERE T2.UUID ...
- springcloud(十):熔断监控Hystrix Dashboard
申明: 这里比较坑爹,大家写的时候要小心,这里和springboot的版本有关系哈,我使用的是2.0 版本,要么调频为1.5 版本,要么使用其他方式 解决错误,我选择了还是用2.0 ...