问题描述
我试图从一个特别繁重的功能中压缩所有可能的优化方法。当前,有以下部分:
//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;
应该可以(目前无法测试...)。我相信它应该编译为更少的操作...假设编译器尚未以类似的方式优化原始代码。
话虽如此,这不是因为您做得更少,而是要更快。在这种优化水平上,分支预测,缓存未命中以及……我可能不知道的其他许多因素也会发挥作用。
我真的不建议进行这种优化(除非已证明循环是关键任务瓶颈),但出于教育目的,这可能很有趣。