编程之美-CPU占用率

来源:互联网 发布:音乐播放设备 知乎 编辑:程序博客网 时间:2024/05/24 02:37

CPU是4核,3.10GHz,废话不多说,上代码。

代码

#include <stdio.h>#include <math.h>#include <windows.h>/************************************************************************    1.1 让CPU占用率曲线听你指挥************************************************************************//************************************************************************    CPU占用50%:解决方法一************************************************************************/void first(){    while (true)    {        for (double i = 0; i < 3 * pow(10.0, 5); i++);        Sleep(10);    }}/************************************************************************    CPU占用50%:解决方法二************************************************************************/void second(){    int busyTime = 10;    int idleTime = busyTime;    double startTime = 0;    while (true)    {        startTime = GetTickCount();        while ((GetTickCount() - startTime) <= busyTime);        Sleep(idleTime);    }}/************************************************************************    粗粒度实现CPU占用 percent% 需要微调************************************************************************/void third(int percent){    double busyTime = percent;    double idleTime = 100-percent;    double startTime = 0;    while (true)    {        startTime = GetTickCount();        while ((GetTickCount() - startTime) <= busyTime);        Sleep(idleTime);    }}/************************************************************************    绘制正弦曲线************************************************************************/void four(){    // 每次正弦曲线前进0.01*PI,则需要200次    const double SPLIT = 0.01;    const int COUNT = 200;    const double PI = 3.1415926;    // 峰值300,峰底0    const int INTERVAL = 300;    // 忙时和闲时    double busyTime[COUNT];    double idleTime[COUNT];    int half = INTERVAL / 2;    double radian = 0.0;    // 获得busyTime和idleTime    for (int x = 0; x < COUNT; x++)    {        busyTime[x] = half + sin(radian*PI) * half;        idleTime[x] = INTERVAL - busyTime[x];        radian += SPLIT;    }    double startTime = 0;    int j = 0;    while (true)    {        j = j % COUNT;        startTime = GetTickCount();        while (GetTickCount()-startTime <= busyTime[j]);        Sleep(idleTime[j]);        j++;    }}int main(int argc, char *argv[]){    SYSTEM_INFO info;    // 调用API函数来获取计算机硬件的信息     GetSystemInfo(&info);    // cpu核数      //printf("dwNumberOfProcessors : %d\n",info.dwNumberOfProcessors);    DWORD dwThreadId;      HANDLE hThread = NULL;      int coreNum = info.dwNumberOfProcessors;      for(int i = 0 ; i < coreNum ; i ++)    {          // 针对third函数 如果是其他三个 hThread = CreateThread(0,0,(LPTHREAD_START_ROUTINE)first,0 ,0,&dwThreadId);        hThread = CreateThread(0,0,(LPTHREAD_START_ROUTINE)third,(LPVOID)20,0,&dwThreadId);        // 针对cpu核i(from 0)          SetThreadAffinityMask(hThread,1<<i);    }    // 传入INFINITE表示无限等待      WaitForSingleObject(hThread, INFINITE);     return 0;}

效果图

50%CPU占用

这里写图片描述

粗粒度任意CPU占用率

这里写图片描述

正弦曲线

这里写图片描述

0 0