cpu占用率曲线问题--疯狂的程序员程序竞赛第一期
1.CPU占用率固定在50%,为一条直线2.CPU占用率为一条直线,但具体占用率由命令参数决定(1-100)
3.CPU占用率状态是一条正弦曲线
语言不限制,平台不限制
每个提交答案的用户奖励100社区金钱
要求:
1。能在真实平台上运行(给出自己的编译运行环境)
2。与前面用户提交答案不一样(如算法不一样,平台不一样,语言不一样,优化程度不一样)
[[i] 本帖最后由 jolestar 于 2008-8-13 01:54 编辑 [/i]] 呵呵,在出编程之美上的题啊!!! 这题在某一期的《程序员》上出过。 .NET实现是比较简单的 毕竟windows是微软的东西 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]] :L 我是学java的
这么底层的东西没碰过!
正弦曲线
正弦曲线:#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++的,在一个群里看见的!
忘说了
和楼上的一样 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]] :lol 绝大叔那样的高手会不会去HOOK TASKMGR.EXE啊 某期《程序员》上貌似有这题~ 哈哈哈~~~全世界都知道这道题目
页:
[1]