发新话题
打印

cpu占用率曲线问题--疯狂的程序员程序竞赛第一期

本主题由 System 于 2008-9-14 05:06 解除限时高亮

cpu占用率曲线问题--疯狂的程序员程序竞赛第一期

1.CPU占用率固定在50%,为一条直线
2.CPU占用率为一条直线,但具体占用率由命令参数决定(1-100)
3.CPU占用率状态是一条正弦曲线

语言不限制,平台不限制

每个提交答案的用户奖励100社区金钱

要求:
1。能在真实平台上运行(给出自己的编译运行环境)
2。与前面用户提交答案不一样(如算法不一样,平台不一样,语言不一样,优化程度不一样)

[ 本帖最后由 jolestar 于 2008-8-13 01:54 编辑 ]

TOP

呵呵,在出编程之美上的题啊!!!

TOP

这题在某一期的《程序员》上出过。

TOP

.NET实现是比较简单的 毕竟windows是微软的东西

TOP

CPU Genuine Interl(R) CPU 2140@1.60GHZ 1.60GHZ
酷瑞双核1.6
操作系统是xp
编译工具:VC6.0
#include "Windows.h"
#include "stdlib.h"
#include "math.h"

const double SPLIT = 0.01;
const int COUNT = 200;
const double PI = 3.14159265;
const int INTERVAL = 300;

int main(int argc, char* argv[])
{
    SetProcessAffinityMask(
         GetCurrentProcess(),
         0x00000001          //cpu mask 也就是双核的主CPU处理,由于是双核,我只用一个CPU来处理演示.
         );

     DWORD busySpan[COUNT];  //array of busy times CPU处理时间
     DWORD idleSpan[COUNT];  //array of idle times 刷新周期总时间
     //int half = INTERVAL / 2; //正旋波需要的参数,如果是真线可以注释掉.
     double radian = 0.0;
     for(int i = 0; i < COUNT; i++)
     {
         //busySpan   [ i ] = (DWORD)(half + (sin(PI * radian) * half));//正旋波
         busySpan [ i ] = (DWORD)INTERVAL;//这里是占用CPU的关键,双核心的是50%,而单核心的是100%,用INTERVAL=300(双核)就是占用50%如果是150就是25%
                 //busySpan [ i ] = (DWORD)INTERVAL/2;//25%
                 idleSpan [ i ] = INTERVAL - busySpan;
         radian += SPLIT;
     }
     DWORD startTime = 0;
     int j = 0;
     while (true)
     {
         j = j % COUNT;
         startTime = GetTickCount();
         while ((GetTickCount() - startTime) <= busySpan[j]) ;
         Sleep(idleSpan[j]);
         j++;
     }
     return 0;
}
相关文章连接:
http://www.cppblog.com/Fox/archi ... pu_using_curve.html
说实在的,我看这文章也是半桶水,只是把他的程序自己拿来改一下而已,偷懒了


[ 本帖最后由 hpyyang 于 2008-8-19 15:26 编辑 ]

TOP

我是学java的
这么底层的东西没碰过!

TOP

正弦曲线

正弦曲线:

#include "Windows.h"
#include "stdlib.h"
#include "math.h"

const double SPLIT = 0.01;
const int COUNT = 200;
const double PI = 3.14159265;
const int INTERVAL = 300;

int main()
{
    DWORD busySpan[COUNT];
    DWORD idleSpan[COUNT];
    int half = INTERVAL / 2;
    double radian = 0.0;
    for(int i = 0; i < COUNT; i++)
    {
        busySpan = (DWORD)(half + (sin(PI * radian)*half));
        idleSpan = INTERVAL - busySpan;
        radian +=SPLIT;
    }   
   
    DWORD startTime =0;
    int j = 0;
    while(true)
    {
        j = j % COUNT;
        startTime = GetTickCount();
        while((GetTickCount() - startTime) <= busySpan[j]) ;
        
        Sleep(idleSpan[j]);
        j++;
    }   
    return 0;
}   


c++的,在一个群里看见的!

TOP

忘说了

和楼上的一样

TOP

1.CPU占用率固定在50%,为一条直线
2.CPU占用率为一条直线,但具体占用率由命令参数决定(1-100)
解法如下:
根据Perfmon所得值和多少来决定本程序应该使用多少CPU占用率。
具体CPU占用率,由level决定。
(C#代码)

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

[ 本帖最后由 yxnk 于 2008-8-20 13:51 编辑 ]

TOP

绝大叔那样的高手会不会去HOOK TASKMGR.EXE啊

TOP

某期《程序员》上貌似有这题~

TOP

哈哈哈~~~全世界都知道这道题目

TOP

发新话题