Board logo

Subject: 使用专家包时发现Delphi的Cpu占有率极高? [Print This Page]

Author: xu2000    Time: 2007-9-10 00:39     Subject: 使用专家包时发现Delphi的Cpu占有率极高?

我非常喜欢专家包中的一些功能。本来是在单位用的家里不用的。
最近把它拿到家中装上后,发现一启动专家包后,Delphi的CPU占有用可达50%-80%,一禁用就没有问题了,让我十分的不解。希望能得到指点。
Author: Passion    Time: 2007-9-10 01:22

专家包在应用程序OnIdle的时候做了不少事情,因此容易引起CPU占用率过高。同时由于某些IDE的bug也容易导致Idle时频繁出Exception导致CPU占用高。
请问您用的专家包是什么版本,IDE是什么版本?
Author: xu2000    Time: 2007-9-10 22:47

我最开始是下了CnWizards_0.8.2.331_RC2这个版本的并装上去,发现CPU占有率太高了。
单位用的是CnWizards_0.8.2.322_RC1,这在单位用的时候一点问题都没有。
后来我把家里的高版本的卸了,装上单位用的,但也不行。
我家里和单位的IDE都是Delphi7.0。
实在是搞不明白。
Author: stephenmax    Time: 2007-9-11 09:21

我发现关闭fastcode优化后,ide无论稳定性还是cpu占用率都有比较好的改善
我用的2007,如果开着fastcode优化,工程一大,文件一多,有时候会莫名其妙报错
Author: niaoge    Time: 2007-9-11 16:24

这个问题我早就提过,
cw借由OnIdle事件来分析代码,判断当前代码更改状态等信息,
通常,在一般的程序中OnIdle只有空闲时触发一次,但是不知道为什么在IDE中一直不断地触发,
这可能是IDE的某些Bug或是一些其它的额外的线程导致IDE从空闲回到忙然后又恢复到空闲,从而再次触发OnIdle事件
有点像一个死循环,但是又不同于死循环

不同的版本的IDE触发OnIdle的频率不一样,D10约1秒一次,D11少于半秒一次,所以cw在D11中使用比d10更占用资源
OnIdle有个Done boolean类型的参数,我曾试着加以控件以期减速少OnIdle触发次数,但是由于本人功力不够,没有得逞

不知道Passion和Zjy有没有更好的法子或是不要OnIdle事件

----
我刚好在我的程序中使用大量的线程,但我发现一个奇怪的问题,同样的代码,线程在dll或是bpl中退不出来,在Exe中却能正常退出,不知会不会passion和zjy有帮助

[ 本帖最后由 niaoge 于 2007-9-11 16:29 编辑 ]
Author: Passion    Time: 2007-9-11 16:32

Idle是连续不断触发的。VCL代码中写的是当应用程序主窗体消息队列中无消息时便会被调用。
我们在OnIdle里头加了延时机制以减少了调用次数。照理说1秒一次或半秒一次的话,不会太占CPU的。就怕onidle中调用的代码触发了excpetion等比较费时的操作。
Author: niaoge    Time: 2007-9-12 18:05

有两个地方我改了,
不知道对不对,

所有全局变量 HHOOK (3-4个pas文件有)全部不要,然后 CallNextHookEx第一个参数改成 HHOOK(nil)
(有资料显示,dll中HHOOK可以不要,我本人是不怎么懂,也没有深入地研究过)
CnEditControlWrapper.pas 内 GetEditorContext这个函数内 Result.ModTime := Editor.EditView.Buffer.GetCurrentDate 不要
然后,当比较OldContext 与 Context 没有ctModified时,再次通过另一个函数获得ModTime这个值

经过这样改动之后,bds.exe 的cup占用率从原来的30-50%降到10%以下,目前没发同使用当中出错的地方,
不知道对不对,错了不要扔砖头啊
Author: niaoge    Time: 2007-9-13 09:26

CnWizUtils.pas有四个函数
CnOtaGetFormEditorFromModule,
CnOtaGetCurrentSourceFile,
CnOtaGetCurrentModule,
CnOtaGetProjectGroup,
这四个函数的值能不能做成一个全局变量,通过判断当前工程文件状态一次性更新,然后直接取这些值
虽然这四个函数单次执行不耗时,但是执行次数非常多(半个小时之内有上百万次),加起来还是很耗时,
我现在的的代码,这四个函数耗时最多




Welcome to CnPack Forum (http://bbs.cnpack.org/) Powered by Discuz! 5.0.0