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

Delphi:如何有效地反转给定数组中每一项的符号,delphi,bit-manipulation,delphi-10.3-rio,Delphi,Bit Manipulation,Delphi 10.3 Rio,我试图从一个特别重的函数中挤出每一个可能的优化。目前,有以下部分: //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在评论中提到的

我试图从一个特别重的函数中挤出每一个可能的优化。目前,有以下部分:

//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;
//var
//品脱,塑料:品脱;
品脱:=@m[0];
pLast:=@m[高(m)];

虽然像Andreas在评论中提到的NativeUInt(品脱),但这可能是过早的/毫无意义的优化。但是你可以试试

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

而NativeUInt(品脱)则是超快的。(但也许你不知道这个功能?)你需要测量一下,找出你的应用程序中的瓶颈在哪里。我严重怀疑上面的代码是一个瓶颈。除非——当然——有一种方法可以在不改变数组中每个整数的符号的情况下解决您的实际问题。@AndreasRejbrand抱歉,我不明白。高()能帮我多少忙?
High(m)
看起来比
Length(m)-1
好看。保存六个字符。从语义上讲,
High
正是您想要的——最后一个索引。(就像在英语中,“去街上的最后一所房子”听起来比“去指数等于房子数量减去1的房子”更自然。)不过,这不太可能让你的代码更快。哦,谢谢。另外,我刚刚找到了避免标志反转的方法。。。我应该删除我的问题吗?如果你想的话。也许有人有一些很好的汇编技巧可以分享,但是在任何情况下,您都不应该在不首先测量代码并确定实际瓶颈的情况下尝试优化代码。即使N=10000,您在这个Q中的代码也将在一秒钟内完成。尽管如此,它还是非常快。(但也许你不知道这个功能?)你需要测量一下,找出你的应用程序中的瓶颈在哪里。我严重怀疑上面的代码是一个瓶颈。除非——当然——有一种方法可以在不改变数组中每个整数的符号的情况下解决您的实际问题。@AndreasRejbrand抱歉,我不明白。高()能帮我多少忙?
High(m)
看起来比
Length(m)-1
好看。保存六个字符。从语义上讲,
High
正是您想要的——最后一个索引。(就像在英语中,“去街上的最后一所房子”听起来比“去指数等于房子数量减去1的房子”更自然。)不过,这不太可能让你的代码更快。哦,谢谢。另外,我刚刚找到了避免标志反转的方法。。。我应该删除我的问题吗?如果你想的话。也许有人有一些很好的汇编技巧可以分享,但是在任何情况下,您都不应该在不首先测量代码并确定实际瓶颈的情况下尝试优化代码。即使N=10000,你在这个Q中的代码也会在很短的时间内完成。我看不出这个代码的意义。它更难阅读,而且可能更慢。我刚刚测试过它。。。根据编译器选项的不同,最坏情况下此代码所需的时间比具有相同选项的原始代码长15%,而最佳情况下执行时间缩短一半。如果启用优化,我还没有看到任何选项组合会降低速度。我不明白这段代码的意义。它更难阅读,而且可能更慢。我刚刚测试过它。。。根据编译器选项的不同,最坏情况下此代码所需的时间比具有相同选项的原始代码长15%,而最佳情况下执行时间缩短一半。如果启用了优化,我还没有看到任何选项组合会降低速度。