string - 没有引用计数的交换字符串

标签 string delphi quicksort

在 QuickSort 中,大量时间花在交换 temp:=var[i]; var[i]:=var[j]; var[j]:=temp 上。 .当变量为整数时,我为大型随机数组计时 140 毫秒。当变量为字符串时,时间为 750 毫秒。在我看来,大部分差异是由于需要更新所有三个作业中的引用计数造成的。
但这有必要吗?毕竟,var[i] 和 var[j] 的引用计数在这三个赋值之前和之后是相同的。下面的代码会破坏东西吗? (不是说它解决了速度问题,而是出于兴趣):

    // P : Pstring;
    move(values[i],P,sizeOf(Pstring));
    move(values[j],values[i],sizeOf(Pstring));
    move(P,values[i],sizeOf(Pstring));
没有临时变量。只有两个指向字符串的指针被互换。如果这没问题,是否有一个 Delphi 函数来交换 2 个指针?

最佳答案

您提出的是一个众所周知且有效的优化。而不是调用 Move函数最好使用强制类型转换执行直接赋值,以避免生成引用计数代码。

var
  temp: Pointer;
.... 
temp := Pointer(var[i]);
Pointer(var[i]) := Pointer(var[j]);
Pointer(var[j]) := temp;
为了使其工作,您需要确信在交换过程中不会引发异常。有效内存的简单分配不会导致异常,因此可以轻松消除这种担忧。

关于string - 没有引用计数的交换字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65648109/

相关文章:

swift - Swift 中的 NSData 到 String

c++ - 用单个字符初始化字符串

delphi - 将字符一一添加到TMemo

algorithm - 随机快速排序

c++ - C++ 中的 QuickSort 不会完成排序

c++ - 如何使用 Regex 分隔此字符串

javascript - 如何使用正则表达式在路径中查找特定字符串?

performance - CreateProcess 的快速替代方案

delphi - Indy IMAP 在点处切断消息

algorithm - Quicksort - 哪个子部分应该首先排序?