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;

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

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

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...