|
|
发表于 2005-9-29 19:35:00
|
显示全部楼层
Re:资源占有率太高了
嗯,这个问题我也寻找了很久,终于把这个现象搞懂,懂了之后才知道自己对Windows程序的陌生,对程序的陌生。举个例子
int k=0;
while(1) {
k++;
}
上面的程序CPU占用率就会是100%
while(1) {
k++;
Sleep(1);
}
CPU占用率0%
while(1) {
DWORD oldTime = timeGetTime();
while(timeGetTime()-oldTime < 1 )
{ k++; }
Sleep(1);
}
理论上CPU占用50%,上面的代码是为了说明问题,我并没有调试。
主要说明一个问题,上面Sleep(1) 以上的代码是100%占用了1ms。
而Sleep(1)表示释放CPU控制权,所以总体CPU占用是50%
对于一般的编程,一般是不会去体会这个问题的,但对于要求精度要求
极高的时候,会出现很不正常的现象和BUG,一些依赖时间准确的程序根本
不能正确执行,所以在某些情况下,对这段程序最低执行时间有个了解,这
主要包括,最少需要执行多少次,每一次占用多长时间。
上面说的是思想上应当由准备的东西,而接下提到的是Windows系统对程序的
影响.Windows系统是一个模拟多线程的系统,所谓抢先式多任务系统,简单
说就是,在一个或多个CPU上同时执行多个程序,而一般只有一个CPU,即使
有几个,也不能保证完全分配给某个线程,所以每一线程都不能在准确的时间
执行,而且我们写的代码也不能在要求的时间内执行完,如果你这个线程没有
执行完,就很有可能影响到下一个线程的执行,这样导致互相争抢线程造成CPU
占用过高。
上一段说了一个情况,如果在这种环境下你还要求顺畅运行程序,那么就只有
一个思想上的理想做法:学习一本书《windows核心编程》,把Windows核心操
作了解清楚,运用硬件计时器来为你的每一个任务进行定时操作,使系统不会
互相抢占CPU,其实理论上如果把所做事情的时机都控制好,也就是说CPU占用
多少可以自己控制,其他时间都释放给系统,实际上这个释放CPU不是一定是个
好事情,如果你释放了,别人写了一个不太好的CPU调度程序也在运行会影响
到你的程序,所以游戏程序尽量不释放任何CPU,只有自己占有。另一个角度
看,如果你控制好了每一段程序的执行时机,即时占用CPU100%也不会影响到
其他程序和自己的运行流畅。
如果想简单的降低CPU占用率那在主循环中调用一个Sleep(5)好像是可以解决
问题,但实际上不是这样的,假设你写了某个
while(i<10000000000000000){ dosomething(); }
你一样是个占CPU的高手;
你的程序一般是因为 这种循环次数感觉是无数次,但是你是在让CPU永不停息
的去重复做了你那个简单的功能,所以它就会占CPU过多,或说是完全占有了。 |
|