Maj*_*eri -1 delphi micro-optimization
我有一个微观优化问题。我有 3 种处理 typed-Pointer(array) 的方法。哪一个更好?
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)
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)
While ArrCount>0 do
begin
Inc(P) ; // P is typed-Pointer
// do somethings
Dec(ArrCount);
end;
Run Code Online (Sandbox Code Playgroud)
我对这个问题的回答可能比你想象的更为平凡。这些变体中最快的变体是等待它并定时运行最快的变体。
在不同的架构上,您会发现不同的变体获胜,这是完全合理的。
还可以想象,根据循环体中的内容,不同的变体将获胜。
循环体也很可能花费足够的时间,相比之下循环本身可以忽略不计。
简而言之,这取决于。由于只有您知道体内发生了什么,因此只有您才能回答具体问题。
顺便说一句,如果循环体不引用循环变量,则编译器将重写升序循环,就像它是降序循环一样。所以实际上这里可能只有两种变体。事实上,这可能意味着所有三个变体都会产生相同的编译代码!
一些忠告:
现在,如果您想让我猜测一下,我预测对于任何大于平凡的循环体nop,您会发现很难在这些变体之间找到任何可测量的差异。
我还看到您正在使用指针来遍历数组。您可能会发现,如果此代码是瓶颈,并且循环体仅处理此数组迭代,则使用arr[]索引比指针算术更有效。但同样,这取决于很多因素,您必须进行分析并查看编译器生成的代码。
| 归档时间: |
|
| 查看次数: |
2596 次 |
| 最近记录: |