cpu利用率的问题

refeiner 2008-04-29 09:37:38
在网上看了答案,自己改了一下,结果不是很满意
class Win32
{

[DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
public static extern int SetThreadAffinityMask(IntPtr hWnd, int nIndex);
}

IntPtr nHD = new IntPtr(Thread.CurrentThread.ManagedThreadId);
Win32.SetThreadAffinityMask(nHD, 0x00000000);

const double SPLIT = 0.01;
const int COUNT = 200;
const double PI = 3.14159265;
const int INTERVAL = 300;//May be height

int[] busySpan = new int[COUNT];
int[] idleSpan = new int[COUNT];
int half = INTERVAL / 2;
double radian = 0.0;

for (int i = 0; i < COUNT; i++)
{
busySpan[i] = (int)((half + (Math.Sin(PI * radian) * half)));
idleSpan[i] = INTERVAL - busySpan[i];
radian += SPLIT;
}


int startTime = 0;
int j = 0;

while (true)
{
j = j % COUNT;
startTime = Environment.TickCount;
while ((Environment.TickCount - startTime) <= busySpan[j])
{

}
Thread.Sleep(idleSpan[j]);
j++;
}
结果:曲线很不好看,尽管是正弦了

问题
1、我用的是双核CPU,用一个死循环,可以让CPU稳定在50%左右,是为什么?
我猜测一个CPU管用户进程,另一个管着系统进程,但是后面用上面代码,两个CPU图都显示为正弦。。晕了
2、Win32.SetThreadAffinityMask(nHD, 0x00000000),让进程在第一个CPU上运行,但是不管我怎么调第二个参数,得到的结果都是一样的,WHY?
3、怎么样让曲线更回平滑?
上面的INTERVIAL也就是一个时间调度单位,在这个时间内,有一个忙和闲的比例。理论上说,
1)COUNT数值越大,randian越小,所得到的点就越多
2)INTERVAL时间越短,表示出的图样就越精细,在0~PI/2之间,INT值表示的比例在多大范围里面可以接受?比如: INTERVAL = 10,那么根本不可 能得到精确的点,但是INTERVAL越大,如2000MS那么图像就基本快没形状态
3)
while ((Environment.TickCount - startTime) <= busySpan[j])
{

}
执行busySpan[j]次,对应豪秒数是多少?sleep(idleSpan[i]),可是结结实实停了那么多豪秒,它们之间的比例还能准切吗?

各位大拿,多多发表看法~
...全文
99 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
浴火_凤凰 2008-04-30
  • 打赏
  • 举报
回复
继续学习中。
UltraBejing 2008-04-30
  • 打赏
  • 举报
回复
有点难度哦
jieao111 2008-04-29
  • 打赏
  • 举报
回复
d

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧