解决cpu占用率过高的问题

来源:互联网 发布:网件访客网络 编辑:程序博客网 时间:2024/04/29 10:39

以下是从百度知道转回来的:

什么代码都没用,CPU占用是windows在分配,与delphi无关,application.processmessage只是处理其他事件而已,cpu同样会占用很高。
无论是用线程还是什么,只要你的cpu闲置,windows就会考虑尽快用更多的cpu将你的指令执行完毕。
唯一的方法是调低自己的程序优先级,将自己降低,但是这也不保证就不占用cpu时间。
所以你不能考虑cpu占用,只需要考虑你的程序在执行大量代码的时候不会阻塞运行就行了。cpu占用你没法调整。
另外,楼上说的强制将代码循环停滞也是一种方法,不过这个就慢了,本来1秒钟可以计算出来的要分成几十秒钟来算了。

 

以下是从盒子论坛转载过来的:

线程轮询串口数据, cpu占用率过高(60-99), 但我在每次查询串口操作后都用了sleep, 从1000, 到10000ms, 变化都不大. 于是想到可能是查询串口的函数本身的问题, 于是trace进入,发现

  repeat
    //sleep(10);
  until (GetTickCount-TickTime>=5000) or (aCPort.InputCount=5);

原来是没有sleep(10)的, 所以等待数据的5秒钟内,都没有休息, 加上10ms的休息后,效果就很好
后来进一步降低到2ms, 效果也很好( cpu占用率从60以上 降到 0-2)

如果把sleep换成application.ProcessMessages; 则作用不大, 原因还等待研究

得出的一个启示:
用于降低cpu占用率的sleep语句中休眠的时长不需要很大,通常在循环中每次Sleep(2)足够了
问题处在处理过于集中。在Sleep()之前执行了大量的分析操作,所以Sleep没有起到该有的作用

改进方式,将工作量均衡。不要在忙的时候不停,在清闲的时候不动弹
比如一趟处理过程, 原来在最后完成时sleep(100), 改为分散在过程中多处sleep(10)

原创粉丝点击