Delphi中的for循环(downto,Reversed)与for循环(递增模式)与while循环

Maj*_*eri -1 delphi micro-optimization

我有一个微观优化问题。我有 3 种处理 typed-Pointer(array) 的方法。哪一个更好?

1

for I:=0 to ArrCount-1 do
begin  // I:Var is unused in below-block
  Inc(P) ; // P is typed-Pointer
  // do somethings 
end;
Run Code Online (Sandbox Code Playgroud)

2

for I:=ArrCount-1  downto  0 do
begin  // I:Var is unused in below-block
  Inc(P) ; // P is typed-Pointer
  // do somethings 
end;
Run Code Online (Sandbox Code Playgroud)

3

While ArrCount>0 do
begin  
  Inc(P) ; // P is typed-Pointer
  
  // do somethings 
  Dec(ArrCount);
end;
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 5

我对这个问题的回答可能比你想象的更为平凡。这些变体中最快的变体是等待它并定时运行最快的变体。

在不同的架构上,您会发现不同的变体获胜,这是完全合理的。

还可以想象,根据循环体中的内容,不同的变体将获胜。

循环体也很可能花费足够的时间,相比之下循环本身可以忽略不计。

简而言之,这取决于。由于只有您知道体内发生了什么,因此只有您才能回答具体问题。

顺便说一句,如果循环体不引用循环变量,则编译器将重写升序循环,就像它是降序循环一样。所以实际上这里可能只有两种变体。事实上,这可能意味着所有三个变体都会产生相同的编译代码!

一些忠告:

  • 切勿在没有分析的情况下进行优化。
  • 永远不要优化不是瓶颈的代码。

现在,如果您想让我猜测一下,我预测对于任何大于平凡的循环体nop,您会发现很难在这些变体之间找到任何可测量的差异。

我还看到您正在使用指针来遍历数组。您可能会发现,如果此代码是瓶颈,并且循环体仅处理此数组迭代,则使用arr[]索引比指针算术更有效。但同样,这取决于很多因素,您必须进行分析并查看编译器生成的代码。