玩转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 ...
随机推荐
- [C#源码]自动更改桌面背景
操作代码:ChangeDesktop.cs using System;using System.Collections.Generic;using System.ComponentModel;usin ...
- js删除局部变量
alert('value:'+str+'\ttype:'+typeof(str)) //声明变量前,引用 var str="dd"; alert('value:'+str+'\tt ...
- 模块挂载、切换,uml模式、流程图模式
模块挂载.切换,uml模式.流程图模式
- 这份Koa的简易Router手敲指南请收下
上一期链接--也就是本文的基础,参考KOA,5步手写一款粗糙的web框架 本文参考仓库:点我 Router其实就是路径匹配,通过匹配路径,返回给用户相应的网站内容. 以下方例子为例,主要通过提取req ...
- 洛谷——P1156 垃圾陷阱
P1156 垃圾陷阱 题目描述 卡门――农夫约翰极其珍视的一条Holsteins奶牛――已经落了到“垃圾井”中.“垃圾井”是农夫们扔垃圾的地方,它的深度为D(2 \le D \le 100)D(2≤D ...
- PHP上传文件到七牛(Qiniu)
上传文件到七牛最简单的方式就是使用七牛官方最新的SDK 安装PHP SDK composer require qiniu/php-sdk 上传文件到七牛 use Qiniu\Auth; use Qin ...
- 用python写了一个猜年龄小游戏
写一个猜年龄游戏: 需要实现用户登录的功能 初始用户登录信息为 {'hades': '13579','nick': '123','ruixing': 'a1','fanping': 'b2'} 登录时 ...
- 谈谈TCP中的TIME_WAIT
所以,本文也来凑个热闹,来谈谈TIME_WAIT. 为什么要有TIME_WAIT? TIME_WAIT是TCP主动关闭连接一方的一个状态,TCP断开连接的时序图如下: 当主动断开连接的一方(Initi ...
- 洛谷 4172 [WC2006]水管局长
[题解] 我们把操作倒过来做,就变成了加边而不是删边.于是用LCT维护动态加边的最小生成树就好了.同样要注意把边权变为点权. #include<cstdio> #include<al ...
- Bazinga HDU 5510 Bazinga(双指针)
Bazinga HDU 5510 Bazinga(双指针) 题链 解法:对于串i来说,如果串i是不符合的,那么代表串i之前的字符串都是i的子串,那么我们求一个新的i(定义为ti),如果i是ti 的子串 ...