疯狂的程序员's Archiver

感谢您对《疯狂的程序员》的爱护和支持,欢迎小说的读者到《疯狂的程序员》讨论区交流。
我们将定期从中评选出热心读者若干名,免费赠阅我们以后出版的图书。
请会员填写有效的邮箱,否则无法收到获奖邮件。

jolestar 发表于 2008-8-13 01:52

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

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

语言不限制,平台不限制

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

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

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

yxnk 发表于 2008-8-17 10:10

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

brightchen 发表于 2008-8-17 14:12

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

jiangzhuo 发表于 2008-8-18 00:16

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

hpyyang 发表于 2008-8-19 11:22

CPU Genuine Interl(R) CPU [email=2140@1.60GHZ]2140@1.60GHZ[/email] 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[i];
         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;
}
相关文章连接:
[url=http://www.cppblog.com/Fox/archive/2008/04/17/control_cpu_using_curve.html]http://www.cppblog.com/Fox/archi ... pu_using_curve.html[/url]
说实在的,我看这文章也是半桶水,只是把他的程序自己拿来改一下而已,偷懒了:lol :lol[/i]

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

i_ing 发表于 2008-8-19 12:49

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

wokaokeji 发表于 2008-8-19 19:37

正弦曲线

正弦曲线:

#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[i] = (DWORD)(half + (sin(PI * radian)*half));
        idleSpan[i] = INTERVAL - busySpan[i];
        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++的,在一个群里看见的!

wokaokeji 发表于 2008-8-19 19:38

忘说了

和楼上的一样

yxnk 发表于 2008-8-20 13:42

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);
    }
}

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

jiangzhuo 发表于 2008-8-21 04:14

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

paradise0317 发表于 2008-8-21 22:56

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

北纬31度 发表于 2008-8-27 12:44

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

hfefuxer 发表于 2008-12-22 18:04



页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.