Code: Alles auswählen
FUNCTION Vergl_S(VAR a,b: STRING):BOOLEAN;
VAR s,i,l,la,lb: LONGINT;
BEGIN
i:=abspalte; s:=0;
la:=LENGTH(a); lb:=LENGTH(b);
l:=la; IF l > lb THEN l:=lb;
IF l > bisspalte THEN l:=bisspalte;
WHILE (s = 0) AND (i <= l) DO BEGIN
IF grossklein
THEN s:= ORD(a[i]) - ORD(b[i])
ELSE s:= ORD(UPCASE(a[i])) - ORD(UPCASE(b[i]));
INC(i);
END;
IF s = 0
THEN
IF (la <= lb) THEN s:=-1 ELSE s:=1
ELSE
IF (s < 0) THEN s:=-1 ELSE s:=1;
(* TRUE if a > b *)
Vergl_S:=(s = -1); IF reverse THEN Vergl_S:=(s = 1);
END;
Meine Daten sind Zeilen bis 255 Zeichen lang, ich speichere sie in einer einfach verketteten Liste und der Quicksort kommt recht schnell damit klar.
Nun hatte ich immer mal wieder die Idee, PCHAR zu benutzen, sei es aus Geschwindigkeitsgründen oder wegen Speicherplatz - jedes Listenelement nimmt momentan 272 Bytes vom Heap bei String, bei PCHAR waren/sind es abhängig von der wirklichen Länge eben weniger (48, 64, 128 usw.).
Wenn ich mich recht erinnere, hatte ich immer mal wieder Argumente pro und contra PCHAR bzw STRING, zuletzt hatte ich eben PCHAR bei 16bit (weil mir der Heap wichtiger war) und STRING bei 32/64bit (bis 10 Mio Zeilen sind eh drin, also ist Geschwindigkeit wichtiger). Nun wollte ich (mal wieder) diese Aufteilung aufheben und einheitlich eins nehmen (PCHAR oder STRING) und habe alle 4 Varianten getestet als Sonntagsbeschäftigung. STRING bei 16bit fiel durch, also Entscheidung für PCHAR auch bei 32/64bit.
Nun stelle ich einen Geschwindigkeitsverlust fest, zwischen 30 und 100% mehr Laufzeit, das kann ich nicht so lassen. Als Ursache sehe ich natürlich das Konvertieren in/aus der gespeicherten Form (Liste mit PCHAR-Elementen) und eben von/nach der Ein-/Ausgabe-Form STRING. u.a. durch STRPAS und STRPCOPY. Bei der Ein-/Ausgabe kann ich es noch hinnehmen, was ich aber nicht bedacht hatte (damals so 2005): ich benutze meine o.a. Vergleichsfunktion und muß daher, wenn ich PCHAR speichere, eine "Krücke" wie diese hier benutzen
Code: Alles auswählen
FUNCTION Vergl_P(a,b: PCHAR):BOOLEAN;
VAR stra,strb: STRING;
BEGIN
stra:=STRPAS(a); strb:=STRPAS(b);
Vergl_P:=Vergl_S(stra,strb);
END;
Die Geschwindigkeit, wenn ich zB nur StrLComp benutze, steigt zwar wieder, es fehlen nur noch 30% aber ich würde es versuchen auch noch an der Eingabe-/Ausgabe-Konvertierung zu basteln wobei ich ehrlich außer STRAPAS und STRPCOPY nichts kenne. Oder ich muß die Idee begraben. Ohne Vergl-Funktion für PCHAR muß ich es sowieso...