2

我主要对稳定排序大型字符串数组感兴趣。使用真实世界的数据,我成功地以 10-100 倍击败了 Tarray.sort(即使后者不稳定)。作为练习,我尝试对简单类型重复此操作。工作正常。然后将它捆绑到一个泛型类中,就像在 Tarray 中一样。考虑我的出发点:

procedure sortArray(var values : array of byte); overload;
var temp : array of byte;
  function getSequence(from: integer) : integer;
  procedure doThis(...);
  procedure doThat(...);
begin
  setLength(temp,high(values)+1);
  // actual code calling one of the procedures
end;
procedure sortArray(var values : array of double); overload;
var temp : array of double;
... etc ...

所有本地子例程都可以访问valuestemp。在我看来,尝试泛型如何工作是一个理想的情况。在泛型类中不能有局部子例程,所以这些都变成了方法。然后我有:

type
  TsimpleArray<T>  = class
  private
    class function getSequence(var values,temp : array of T; from: integer) : integer;
    class procedure doThis(var values,temp : array of T; ...);
    ...
  public
    class procedure sort(var values : array of T); 
  end;

类函数无法访问全局临时存储,因此必须将其作为参数传递给所有这些方法以及源数组。所有的comaprisons等都if v>values[k]被更改为if Tcomparer<T>.default.compare(v,values[k])>0。嗯,它有效。但现在它比我的简单程序方法慢了大约 10 倍。(仍然比 Tarray.sort 快很多。)我想这是我们为更好的可维护通用代码付出的代价。或者有什么我可以做得更好的吗?

4

0 回答 0