今天开始看编程之美 。第一个问题是CPU的使用率控制,微软的问题果然高大上,我一看就傻了,啥也不知道。没追求直接看答案试了一下。发现自己电脑太好了,4核8线程,程序乱飘。加了一个进程绑定,可以控制一个CPU的占有率。

代码结果如下:

#include"stdio.h"
#include <Windows.h> void main()
{
//前三行可以不要
SYSTEM_INFO SystemInfo;
GetSystemInfo(&SystemInfo);
int CpuNum=SystemInfo.dwNumberOfProcessors; //获取cpu数目
SetThreadAffinityMask(GetCurrentThread(), ); //线程与cpu绑定
while()
{
for(int i=;i<;i++);
Sleep();
}
}

现在的疑问是,不知道如何指定具体的某一个CPU. SetThreadAffinityMask的第二个参数改了后和自己想要的不一样。也不知道如何实现所有CPU占有率的同时控制。

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

第二个版本 按照书中给的可以根据不同的CPU精确计算时间的代码  效果好很多

//比初始最简单的版本好很多 CPU使用中可以得到非常漂亮的直线 不像之前有锯齿
#include<stdio.h>
#include<Windows.h> void main()
{
const int busyTime=; //10ms
const int idleTime=busyTime; //50% cpu useage
int startTime=; SetThreadAffinityMask(GetCurrentThread(), ); //cpu绑定 while()
{
int startTime=GetTickCount();
//busy loop
while(GetTickCount()-startTime<=busyTime); //idle loop
Sleep(idleTime);
} }

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

第三个版本 正弦曲线 可以调周期和赋值等参数

开始脑子晕了 总是搞不清楚关系 后来看了答案 发现答案的思路很清晰 自己又静下心来分析了一下正弦函数的表达式修改一下自己的代码 也实现了功能 不过曲线上个抖动比较大。

计算公式:

一次取样的时间 busytime+idletime=常数  单位毫秒

忙的时间占得百分比就是正弦函数计算的结果:

busytime/(busytime+idletime)=middle+amplitude*sin(x)

每一次的x值与周期有关

x=n*(busytime+idletime)/1000T      周期单位是秒   n每循环一次加1

代码:

#include<stdio.h>
#include<Windows.h>
#include<math.h>
#include<stdlib.h>
#define Mine 1
#define Answer 0
#if Mine
void main()
{
SetThreadAffinityMask(GetCurrentThread(), ); //cpu绑定
double busyTime;
double idleTime;
double onceTime=; //一次抽样300ms busyTime+idleTime=300
float up=0.8; //正弦曲线波峰值
float down=0.2; //正弦曲线波谷值
int T=; //正弦曲线周期s
int startTime=;
int n=; float amplitude=(up-down)/; //振幅
float middle=(up+down)/; //正弦曲线中心点
while()
{ busyTime=onceTime*(middle+amplitude*sin(*3.1415*n*onceTime/(*T)));
idleTime=onceTime-busyTime; int startTime=GetTickCount(); //busy loop
while(GetTickCount()-startTime<=busyTime); //idle loop
Sleep(idleTime);
n=n+;
} } #endif #if Answer
const int SAMPLING_COUNT=; //抽样点数量
const double PI=3.1415926535;
const int TOTAL_AMPLITUDE=; //每个抽样点对应的时间片 int main()
{
SetThreadAffinityMask(GetCurrentThread(), );
long busySpan[SAMPLING_COUNT];
int amplitude=TOTAL_AMPLITUDE/;
double radian=0.0;
double radianIncrement=2.0/(double)SAMPLING_COUNT;
for(int i=;i<SAMPLING_COUNT;i++)
{
busySpan[i]=(long)(amplitude+(sin(PI*radian)*amplitude));
radian+=radianIncrement;
}
int startTime=;
for(int j=;;j=(j+)%SAMPLING_COUNT)
{
startTime=GetTickCount();
while((GetTickCount()-startTime)<=busySpan[j]);
Sleep(+TOTAL_AMPLITUDE-busySpan[j]);
}
return ;
} #endif

书上代码结果:

自己写得代码结果:

抖动很大 而且onceTime变小后抖动更大了 在onceTime很小的时候 busytime/onceTime=0.5 时曲线都会饱和截至,不知道原因。

注:所有的图都是第一个cpu的结果有效。

【编程之美】CPU的更多相关文章

  1. 编程之美_1.1 让CPU占用率曲线听你指挥

    听到有人说让要写一个程序,让用户来决定Windows任务管理器的CPU占用率. 觉得很好奇.但第一个想法就是写个死循环.哈哈.不知道具体的占用率是多少,但至少能保证在程序运行时,CPU的占用率终会稳定 ...

  2. 《编程之美》之如何控制CPU的暂用率固定在50%

    <编程之美>第一章 让CPU暂用率听你指挥的粗糙实现,如何控制CPU的暂用率固定在50% #include <stdio.h> #include <Windows.h&g ...

  3. java并发编程之美-阅读记录1

    1.1什么是线程? 在理解线程之前先要明白什么是进程,因为线程是进程中的一个实体.(线程是不会独立存在的) 进程:是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,线程则是进程中的 ...

  4. 【编程之美】2.5 寻找最大的k个数

    有若干个互不相等的无序的数,怎么选出其中最大的k个数. 我自己的方案:因为学过找第k大数的O(N)算法,所以第一反应就是找第K大的数.然后把所有大于等于第k大的数取出来. 写这个知道算法的代码都花了2 ...

  5. 编程之美的2.17,数组循环移位 & 字符串逆转(反转) Hello world Welcome => Welcome world Hello

    代码如下:(类似于编程之美的2.17,数组循环移位) static void Main(string[] args) { string input = "Hello World Welcom ...

  6. [质疑]编程之美求N!的二进制最低位1的位置的问题

    引子:编程之美给出了求N!的二进制最低位1的位置的二种思路,但是呢?但是呢?不信你仔细听我道来. 1.编程之美一书给出的解决思路 问题的目标是N!的二进制表示中最低位1的位置.给定一个整数N,求N!二 ...

  7. 编程之美 两个叶子的节点之间 最大距离 变种 leecode

    提交地址: https://oj.leetcode.com/problems/binary-tree-maximum-path-sum/ 说一下思路http://www.cnblogs.com/mil ...

  8. 编程之美之数独求解器的C++实现方法

    编程之美的第一章的第15节.讲的是构造数独.一開始拿到这个问题的确没有思路, 只是看了书中的介绍之后, 发现原来这个的求解思路和N皇后问题是一致的. 可是不知道为啥,反正一開始确实没有想到这个回溯法. ...

  9. 编程三基:cpu:算法,总线(io):一切皆文件;内存:运行空间

    编程三基:cpu:算法,总线:一切皆文件:内存:数据.运行空间 原文找不到了.

随机推荐

  1. 2015年11月26日 Java基础系列(三)ThreadLocal类初级学习

    序,ThreadLocal类是为了解决多线程的安全问题.线程安全的意思也就是说每个线程操作自己的变量,不要对其他线程的值造成影响. 在很多情况下,ThreadLocal比直接使用synchronize ...

  2. 【转载】Unity 合理安排增量更新(热更新)

    原帖地址:由于我看到的那个网站发的这篇帖子很大可能是盗贴的,我就暂时不贴地址了.避免伤害原作者 原版写的有点乱,我个人修改整理了下. --------------------------------- ...

  3. WCF--安全小见解...

    由于WCF写的服务需要Ajax来进行调用(这个配置过程也是一个比较咕~~(╯﹏╰)b的经历...), 所以调用的过程都是前台可以看到的,不加点安全措施上去,真的像是一个裸奔在互联网上的接口... 反正 ...

  4. mac安装mongodb

    一,安装方法1 ,下载mongodb 1,官网下载mongodb程序 https://www.mongodb.org/downloads#production​ 2,解压后启动mongodb服务 下载 ...

  5. 全键盘Vimium快捷键学习记录

    0.设置而 vimium 的默认搜索引擎: http://www.baidu.com/s?wd= j: 向下细微滚动窗口.  k:向上细微滚动窗口. gg:跳转到页面的顶部.G:跳转到页面的底部.r: ...

  6. 【C语言入门教程】2.4 浮点型数据

    浮点型数据又称实型数据,是一个以十进制表示的符号实数.符号实数的值包括整数部分.尾数部分和指数部分. 2.4.1 浮点型常量 一些较大的数值,或者有小数位.指数位的数值都需要用浮点型常量表示.浮点型常 ...

  7. Tomcat 服务器性能优化

    简介 考虑一下这种场景,你开发了一个应用,它有十分优秀的布局设计,最新的特性以及其它的优秀特点.但是在性能这方面欠缺,不管这个应用如何都会遭到客户拒绝.客户总是期望它们的应用应该有更好的性能.如果你在 ...

  8. 学习javascript系列之变量

    在javascript全局变量中,未加var声明的全局变量和加上var声明的全局变量是不同的,虽然都是window对象的属性. ; window.a //1 delete a //false; 通过v ...

  9. Pcserver+oracle10g+rac

    成本的相对廉价,技术的成熟,功能的强大此方案将越来越受中小企业的青睐.     一.实验前准备 虚拟机版本:Vwareserver1.0.6 Linux版本:redhat5.5enterprise服务 ...

  10. python自动化之装饰器

    1 高阶函数 满足下列条件之一就可成函数为高阶函数 某一函数当做参数传入另一个函数中 函数的返回值包含n个函数,n>0 高阶函数示范 def bar(): print 'in the bar' ...