玩转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 ...
随机推荐
- (转)Hibernate框架基础——Java对象持久化概述
http://blog.csdn.net/yerenyuan_pku/article/details/52732990 Java对象持久化概述 应用程序的分层体系结构 基于B/S的典型三层架构 说明 ...
- CAD绘制一个单行文字(com接口VB语言)
主要用到函数说明: _DMxDrawX::DrawText 绘制一个单行文字.详细说明如下: 参数 说明 DOUBLE dPosX >文字的位置的X坐标 DOUBLE dPosY 文字的位置的Y ...
- Java基础概念语法
Java基础概念语法 注释 单行注释 //行注释说明 多行注释 /* 多行注释说明 */ 文档注释 /** *@author 程序的作者 *@version 源文件的版本 *@param 方法的参数说 ...
- ViewData丶ViewBag和TempData
案例: public ActionResult Index() { ViewData[; ViewData.Add(); ViewBag.myNum = ; TempData[; Student st ...
- nginx+keepalived+tomcat+memcache实现双VIP高可用及Session会话保持
Nginx+Keepalived+Tomcat+Memcached 实现双VIP负载均衡及Session会话保持 IP 信息列表: 名称 IP ...
- 学习笔记7——使用Scanner获取键盘输入
使用Scanner类可以很方面地获取用户的键盘输入,Scanner是一个基于正则表达式的文本扫描器,它可以从文件.输入流.字符串中解析出基本类型值和字符串值.Scanner类提供了多个构造器,不同的构 ...
- DBDA
<?php class DBDA{ public $host = "localhost"; //服务器地址 public $uid = "root"; / ...
- 洛谷——P2171 Hz吐泡泡
P2171 Hz吐泡泡 题目描述 这天,Hz大大心血来潮,吐了n个不同的泡泡玩(保证没有重复的泡泡).因为他还要写作业,所以他请你帮他把这些泡泡排序成树(左子树<=根<右子树).输出它的后 ...
- Python学习笔记(3)动态类型
is运算符 ==是值相等而is必须是相同的引用才可以 l=[1,2,3] m=[1,2,3] print(l==m) # True print(l is m) # False sys模块 getref ...
- Java垃圾回收简介
Java关键术语 JavaAPI:一系列帮助开发者创建Java应用程序的封装好的库. Java 开发工具包 (JDK):一系列工具帮助开发者创建Java应用程序.JDK包含工具编译.运行.打包.分发和 ...