避免功能是否会提高性能?

isa*_*isa 2 delphi optimization

这是一个小测试:

function inc(n:integer):integer;
begin
  n := n+1;
  result := n;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  start,i,n:integer;
begin
  n := 0;
  start := getTickCount;
  for i := 0 to 10000000 do begin
    inc(n);//calling inc function takes 73 ms
    //n := n+1; writing it directly takes 16 ms
  end;
  showMessage(inttostr(getTickCount-start));
end;
Run Code Online (Sandbox Code Playgroud)

sha*_*oth 14

是的,调用函数会引入开销.在调用函数之前,必须保存当前状态 - 计划下一步执行哪条指令 - 以及复制函数参数.这需要额外的工作和额外的时间.

这就是内联有用的地方.如果编译器支持它可以直接在调用站点处理功能代码并避免开销.通过对周围代码的良好优化,它甚至可以减少生成的代码量.

这并不意味着你需要避免功能.在大多数情况下,函数体执行的时间比组织调用所需的时间长得多.只有在极少数情况下,开销才值得优化.如果没有探查器的帮助,这绝不可能完成 - 否则你会浪费时间,而且很可能只会得到很多不可维护的代码.

  • 我读过的关于SO的最佳引用就像是*避免功能来提高性能就像削减体重一样.* (22认同)

Pas*_*TIN 5

调用一个函数(无论你使用哪种语言)通常都需要做更多的事情,比如保存一些上下文,将参数推送到某种堆栈,调用函数本身,读取参数,然后将结果推回到某处,从函数返回,提取返回值,...

因此,当然,调用函数通常意味着有一些开销.

但是函数的主要部分是重用代码的某些部分:可能在执行时需要几微秒,但如果你只需要编写一些代码,而不是10次(或更多次),那么巨大的收获; 并且该代码将更容易维护,这在长期内非常重要.

之后,您可能不希望将函数用于一些非常小的代码部分,例如您提供的代码作为示例(好吧,除非您使用的语言提供某种内联事物 - 如果我是C的情况,如果我记得正确;虽然不确定delphi):调用函数的开销很重要,相比函数将节省你写的代码行数(这里:none!相反^^).
但是对于代码的较大部分,与执行函数包含的一堆代码所花费的时间相比,开销会小很多...


Fra*_*ois 5

过早优化是所有邪恶的根源......
使用已知功能(这里是内置伪(魔术)程序公司)编写正确且可维护的代码,对其进行基准测试并重构性能原因所需的位置(如果有的话).

我敢打赌,在99.9%的情况下,避免调用函数或过程不是解决方案.

这是一个示例,其中添加对过程的调用实际上是优化.