在快速排序算法中,大量时间花费在交换变量
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函数用于交换两个指针?
Pointer(...)
强制类型转换比调用Move
更快。这是规避引用计数的惯用方式。 - David Heffernanstring
的变量只是指向字符串堆对象的指针。该对象包含实际字符串以及在非负偏移处的终止空值和元数据(代码页、引用计数和长度)在负偏移处。 - Andreas Rejbrand