改变CPU利用率

1.1让CPU占用率听你的指挥

1.CPU的占用率固定在50%,为一条直线;

解法一:

#include<iostream.h>
#include <windows.h>//头文件
int main()
{
 for(;;)
 {
  for(int i=0;i<10800000;i++);
  Sleep(10);//注意VC中S大写

 }
 return 0;
}

缺点循环的次数不一定固定,不同的CPU是不同的计算方法,cpu的频率*10^9*2/5.原因是cpu每个时钟周期大概2条代码。一个循环的之行是由5条汇编代码组成的,所以平均每秒的之行次数为上面的计算结果。

解法二:

#include<iostream.h>
#include <windows.h>
const DWORD busyTime=10;
const DWORD  idleTime=busyTime;
int main()
{
 
 DWORD startTime=GetTickCount();

    while((GetTickCount()-startTime)<=busyTime);
  Sleep(idleTime);  
 return 0;
}

2.CPU的占用率为一条直线,具体占用率由命令行参数决定(参数范围1-100);

//c#code

static voic makeUsage(float level)
{
 PerformanceCounter p=new PerformanceCounter("Processor","%Processor Time","_Total");
 while(true)
 {
  if(p.NextValue>leval)
   System.Threading.Thread.Sleep(10);
 }
}

3 CPU的占用率为一条正弦曲线

#include<iostream.h>
#include <windows.h>
#include<math.h>
//把一条正弦曲线0-2PI之间的弧度等分成200分进行抽样,计算每个抽样点的振幅
//然后把每咯300ms的时间取下一个抽样点,并让CPU工作对应振幅的时间。
const int SAMPLING_COUNT=200;//抽样点数量
const double PI=3.1415926535;//pi的值
const int TOTAL_AMPLTUDE=300;//每个抽样点对应的时间片

int main(int argc,char* argv[])
{
 DWORD busySpan[SAMPLING_COUNT];
 int amplitude=TOTAL_AMPLTUDE/2;
    double radian=0.0;
 double randianIncrement=2.0/(double)SAMPLING_COUNT;//抽样弧度的增量
 for(int i=0;i<SAMPLING_COUNT;i++)
 {
  busySpan[i]=(DWORD)(amplitude+sin(PI*radian)*amplitude);
  radian+=randianIncrement;
 }
 DWORD startTime=0;
 for(int j=0;;j=(j+1)%SAMPLING_COUNT)
 {
  startTime=GetTickCount();
  while((GetTickCount()-startTime)<=busySpan[j])
  ;
  Sleep(TOTAL_AMPLTUDE-busySpan[j]);
 }
 return 0;
}

如果是使用双核,所以需要在任务管理器里设置其中一个CPU运行程序.使用SetThreadAffinityMask()和GetProcessorInfo().

总结:一些windows的API

1.sleep()当前线程“停”下来

2 WaitForSigleProject()自己停下来。等待某个事件发生

3.GetTickCount ()系统启动到现在经历的毫秒值

4.QueryPerformanceFrequency(),QueryPerformanceCounter()访问精确度更高的CPU数据

5timeGetSystemTime()另一个得到高精度时间的方法

6 PerformanceCounter()效能计数器

7GetProcessorIInfo()/SetThreadAffinityMask()遇到多核的CPU的时候,控制cpu

8 getCPUTickCount()拿到CPU核心运行周期数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值