如何解决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;
应该可以(目前无法测试...)。我相信它应该编译为更少的操作...假设编译器尚未以类似的方式优化原始代码。
话虽如此,这不是因为您做得更少,而是要更快。在这种优化水平上,分支预测,缓存未命中以及……我可能不知道的其他许多因素也会发挥作用。
我真的不建议进行这种优化(除非已证明循环是关键任务瓶颈),但出于教育目的,这可能很有趣。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。