cpu利用率的问题
在网上看了答案,自己改了一下,结果不是很满意
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]),可是结结实实停了那么多豪秒,它们之间的比例还能准切吗?
各位大拿,多多发表看法~