So, das hier ist 20x(*) schneller als deine Methode.
Delphi-Quellcode:
Procedure TFloatPoints.FastRemoveDoubles;
Var
i,j : Integer;
Begin
sort;
j := 0;
for i:=1 to Count-1 do
if not SameFloatPoint(Fitems[i],FItems[j]) then begin
inc(j);
Fitems[j] := fItems[i];
End;
FCount := j;
End;
Die Variante mit der Hashmap hab ich mir geschenkt. Da dürften erst bei > 1 Mio spürbare Unterschiede auffallen: Quicksort ist ja schön schnell.
Davon abgesehen ist auch in 'AddPoints' noch mächtig Luft nach oben.
Delphi-Quellcode:
procedure TFloatPoints.FastAddPoints(Value: TFloatPoints);
var
newCount, newCapacity : integer;
begin
newCount := Self.Count + Value.Count;
if newCount = Self.Count then exit;
while fCapacity < newCount do fCapacity := fCapacity + DeltaCapacity;
SetCapacity(fCapacity);
Move(value.FItems[0],FItems[Count+1], value.Count*SizeOf(value[0]));
self.FCount := newCount;
end;
Den Rest habe ich mir nicht mehr angeschaut, aber ich frage mich, wieso Du die Quellen von TList kopiert hast, wo Du doch dein TFloatPoint einfach in eine TList packen kannst. Dann kannst du dir das ganze Gedöns sparen. Na ja. Mach wie Du denkst.
(*) 20x bei 100.000 Elementen. Sind es mehr, ist der Unterschied noch drastischer. Sind es weniger, dann ist der Unterschied auch nicht mehr so hoch.