Delphi:如何有效地反转给定数组的每个项目的符号

问题描述

我试图从一个特别繁重的功能中压缩所有可能的优化方法。当前,有以下部分:

//m: array of Integer;
//We get it from some other part
N:= Length(m)-1;
for i:=0 to N do
   m[i]:=-m[i];

我需要在每个循环中执行两次此操作(即使用两个数组)。所以,我想知道:还有更好的方法吗?

也许按位操作?我对他们不太了解。会更快吗?如何使其快速

我什至应该尝试优化这一部分,还是足够好?

解决方法

就像安德烈亚斯(Andreas)在评论中提到的那样,这可能是过早/毫无意义的优化。但是你可以尝试

//var
//  pInt,pLast : PInteger;
pInt := @m[0];
pLast := @m[high(m)];
while NativeUInt(pInt) <= NativeUInt(pLast) do
begin
  pInt^ := -pInt^;
  Inc(pInt);
end;

应该可以(目前无法测试...)。我相信它应该编译为更少的操作...假设编译器尚未以类似的方式优化原始代码。

话虽如此,这不是因为您做得更少,而是要更快。在这种优化水平上,分支预测,缓存未命中以及……我可能不知道的其他许多因素也会发挥作用。

我真的不建议进行这种优化(除非已证明循环是关键任务瓶颈),但出于教育目的,这可能很有趣。