Ich hab' bei mir jetzt auch AnsiCompareStr (gleich schnell wie AnsiCompareText) eingebaut. Das hätte ich gleich machen sollen, so sortiert es richtig.
Dadurch konnte ich AnsiUpperCase beim Zeilen Laden entfernen:
Prefetch=0 : 37062 ms
Prefetch=1024 : 6536 ms
Also macht das beim Speicher-Sortieren sehr viel aus. Braucht doppelt solange, aber immer noch fix
Reines Datei-Sortieren ist dabei minimal schneller geworden, warum auch immer.
..und die SkipList vergessen wir, das muss ein Objekt aus der Hölle sein. Das kann nicht menschlich sein
Ich baue dann noch QuickSort mit InsertSort ein, das bring beim Sortieren nochmal 20-25%. Folgenden Code hab ich mit einer Stringliste getestet und mit purem Quicksort verglichen:
Delphi-Quellcode:
{<<<< QuickInsertSort >>>>}
procedure TFormTestSorter.QuickInsertSort(L,R: Integer);
var
I, J : integer;
S, P : String;
begin
// QuickSort für Elemente, die weiter auseinander liegen
if (R - L) > 23 then begin
i := l;
j := r;
p := StringList[(l+r) DIV 2];
repeat
while StringList[i] < p do i := i + 1;
while StringList[j] > p do j := j - 1;
if i <= j then begin
if i < j then begin
s := StringList[i];
StringList[i] := StringList[j];
StringList[j] := s;
end;
i := i + 1;
j := j - 1;
end;
until i > j;
if l < j then QuickInsertSort(l, j);
if i < r then QuickInsertSort(i, r);
// InsertionSort für Element-Entfernungen unter 24
end else begin
for I := L + 1 to R do begin
if (StringList[I] < StringList[I - 1]) then
begin
S := StringList[I];
J := I;
while ((J > L) and (StringList[J - 1] > S)) do
begin
StringList[J] := StringList[J - 1];
J := J - 1;
end;
StringList[J] := S;
end;
end;
end;
end;