奇怪的难题,也许要一些编译的知识

asj 2001-01-05 11:34:00
程序中用到了这样的一个结构
//按钮1处理程序
procedure button1Click();
begin
p1;
end;
//按钮2处理程序
procedure button2Click();
begin
p2;
end;

procedure p1;
begin
CoreP(1);
end;

procedure p2;
begin
CoreP(2);
end;

procedure CoreP(i: Integer);
//子程序,用到递归
procedure ChildP;
begin
...
ChildP;
...
end;
begin
ChildP;
if i = 1 then
...
else
...
end;

结果速度爆慢,实际上只有递归层次为零的时候还能等到结束。
结果,我把按钮的处理函数改变,不再使用P1,P2,而是直接用参数调用CoreP,速度就可以接受了,这是为什么?
递归的成本和函数被调用的层次有关么?
...全文
166 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wao 2001-01-08
  • 打赏
  • 举报
回复
你应该算算算法的代价,有时3和4就是有那么大的差别。
asj 2001-01-08
  • 打赏
  • 举报
回复
我可看不懂汇编啊
sender 2001-01-06
  • 打赏
  • 举报
回复
我还是那句:最好看一看汇编代码(贴上来)。
asj 2001-01-06
  • 打赏
  • 举报
回复
没有人说了么?
asj 2001-01-05
  • 打赏
  • 举报
回复
解解Sender的提示,所有的过程都是类方法。
的确类方法调用代价是较大的,但是如果只是这个不同,第二种调用时间也只应该比第一种少一次
调用类方法的时间。但实际上差距却远远大于这个。按道理耗时操作在后面的递归中,但前面多通过P1P2调用一次却使代价大大增加,是什么原因呢?
sender 2001-01-05
  • 打赏
  • 举报
回复
有一样事情你没有讲清楚,是否所有的过程都是类的方法?
一般情况下递归的代价就是堆栈的处理消耗,还有就是跳转时那个CALL。
如果是类方法,速度肯定会慢的,因为是LONG JUMP。有可能你的程序在通过P1P2调用时使DELPHI按照类方法去处理后面的递归。

具体情况最好看一看汇编代码。

asj 2001-01-05
  • 打赏
  • 举报
回复
可能我说的不太明白,在ChildP中写的那一句ChildP只是为了表示这是一个递归的过程,当然中间有判断语句了,不然怎么可能返回呢?
我所奇怪的是调用到这个过程所经历的层次数,在我的示例中是4层,后来改为3层,会对执行的效率产生很大的影响,这和递归所付出的代价是什么关系呢?
sghe 2001-01-05
  • 打赏
  • 举报
回复
childp()中有没有加条件判断?如
procedure ChildP;
var
...
label theend;
theend:
begin
i:=i-1;
if (...) then
goto theend;
...
ChildP;
...
theend:
end;

SunnyWay 2001-01-05
  • 打赏
  • 举报
回复
下面这个 我看大不明白,好象是死路。
procedure ChildP;
begin
...
ChildP;
...
end;

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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