Einzelnen Beitrag anzeigen

choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#4

Re: Stringoperationen :: Performancemessung am bsp ANSI->

  Alt 8. Dez 2003, 10:31
Wie angekündigt habe ich das Testszenario nun um die beiden Implementierungen (III)
Delphi-Quellcode:
function AnsiToOEMStrAlloc(const AnInput: string): string;
var
  PText : PChar;
begin
  PText:=StrAlloc(Succ(UsedStrLen));
  try
    StrPCopy(PText, AnInput);
    CharToOEM(PText, PText);
    Result:= StrPas(PText);
  finally
    StrDispose(PText);
  end;
end;
vorgeschlagen von X-Dragon, sowie einer Lösung (IV), bei der die Delphi-Implementierung (ab Delphi3?) von Strings ausgenutzt wird, genauer die Tatsache, dass die Zuweisung myPChar:= PChar(myString) gültig ist, weil die Pascal-typschen Dinge wie Längeninformation und Referenzzähler bei negativen Offsets liegen, sowie der Tatsache, dass die Strings null-terminiert sind und CharToOEM die Länge des Strings nicht verändert:
Delphi-Quellcode:
function AnsiToOEMPChar(const AnInput: string): string;
begin
  SetLength(Result, Length(AnInput));
  CharToOEM(PAnsiChar(AnInput), PAnsiChar(Result));
end;
Mit 131072 Strings der Länge 8, die im Gegensatz zum vorherigen Test lediglich Zeichen des Alphabets sowie ein Leerzeichen und die ANSI-Umlaute und das ß enthalten, war bei einem beliebigen Testlauf folgendes Resultat mit (III=stralloc und IV=PChar) zu erkennen:
Code:
Created 131072 random strings (len: 8)
Each function (4) returns same result
origin  [Run 1]: 591 msec (221405 per sec)
origin  [Run 2]: 591 msec (221405 per sec)
origin  [Run 3]: 601 msec (217727 per sec)
origin  [Run 4]: 601 msec (217727 per sec)
origin  [Run 5]: 591 msec (221405 per sec)
origin  [Run 6]: 600 msec (218089 per sec)
origin  [Run 7]: 591 msec (221405 per sec)
origin  [Run 8]: 601 msec (217727 per sec)
refact  [Run 1]: 80 msec (1618172 per sec)
refact  [Run 2]: 70 msec (1846084 per sec)
refact  [Run 3]: 80 msec (1618172 per sec)
refact  [Run 4]: 71 msec (1820444 per sec)
refact  [Run 5]: 90 msec (1440351 per sec)
refact  [Run 6]: 80 msec (1618172 per sec)
refact  [Run 7]: 80 msec (1618172 per sec)
refact  [Run 8]: 90 msec (1440351 per sec)
stralloc [Run 1]: 160 msec (814111 per sec)
stralloc [Run 2]: 151 msec (862315 per sec)
stralloc [Run 3]: 130 msec (1000549 per sec)
stralloc [Run 4]: 140 msec (929588 per sec)
stralloc [Run 5]: 130 msec (1000549 per sec)
stralloc [Run 6]: 150 msec (868026 per sec)
stralloc [Run 7]: 161 msec (809086 per sec)
stralloc [Run 8]: 140 msec (929588 per sec)
PChar   [Run 1]: 50 msec (2570039 per sec)
PChar   [Run 2]: 40 msec (3196878 per sec)
PChar   [Run 3]: 50 msec (2570039 per sec)
PChar   [Run 4]: 40 msec (3196878 per sec)
PChar   [Run 5]: 50 msec (2570039 per sec)
PChar   [Run 6]: 40 msec (3196878 per sec)
PChar   [Run 7]: 50 msec (2570039 per sec)
PChar   [Run 8]: 40 msec (3196878 per sec)
deutlicher wird der Geschwindkeitsvorsprung von (IV) jedoch bei Strings größerer Länge (hier: 512 Zeichen):
Code:
Created 131072 random strings (len: 512)
Each function (4) returns same result
origin  [Run 1]: 33898 msec (3866 per sec)
origin  [Run 2]: 33899 msec (3866 per sec)
origin  [Run 3]: 33959 msec (3859 per sec)
origin  [Run 4]: 33889 msec (3867 per sec)
origin  [Run 5]: 34029 msec (3851 per sec)
origin  [Run 6]: 33898 msec (3866 per sec)
origin  [Run 7]: 33909 msec (3865 per sec)
origin  [Run 8]: 33769 msec (3881 per sec)
refact  [Run 1]: 1392 msec (94093 per sec)
refact  [Run 2]: 1372 msec (95463 per sec)
refact  [Run 3]: 1392 msec (94093 per sec)
refact  [Run 4]: 1392 msec (94093 per sec)
refact  [Run 5]: 1392 msec (94093 per sec)
refact  [Run 6]: 1392 msec (94093 per sec)
refact  [Run 7]: 1402 msec (93422 per sec)
refact  [Run 8]: 1392 msec (94093 per sec)
stralloc [Run 1]: 1161 msec (112798 per sec)
stralloc [Run 2]: 1172 msec (111740 per sec)
stralloc [Run 3]: 1162 msec (112701 per sec)
stralloc [Run 4]: 1161 msec (112798 per sec)
stralloc [Run 5]: 1162 msec (112701 per sec)
stralloc [Run 6]: 1152 msec (113679 per sec)
stralloc [Run 7]: 1161 msec (112798 per sec)
stralloc [Run 8]: 1172 msec (111740 per sec)
PChar   [Run 1]: 601 msec (217727 per sec)
PChar   [Run 2]: 591 msec (221405 per sec)
PChar   [Run 3]: 591 msec (221405 per sec)
PChar   [Run 4]: 601 msec (217727 per sec)
PChar   [Run 5]: 590 msec (221780 per sec)
PChar   [Run 6]: 601 msec (217727 per sec)
PChar   [Run 7]: 601 msec (217727 per sec)
PChar   [Run 8]: 591 msec (221405 per sec)
Die Darstellung der Unteraufrufe sieht bei den beiden Varianten (III) und (IV) wie folgt aus:
Code:
Routine Name | % Time w C | Hit Count
--------------+------------+----------
StrPas       |      43,93 |   131072
StrAlloc     |      13,32 |   131072
StrDispose   |      12,34 |   131072
body only    |      11,51 |   131072
CharToOem    |      11,36 |   131072
StrPCopy     |       7,54 |   131072

             Ergebnisse für (stralloc)


Routine Name | % Time w C | Hit Count
--------------+------------+----------
LStrSetLength |      69,87 |   131072
CharToOem    |      20,91 |   131072
body only    |       6,35 |   131072
LStrLen      |       2,87 |   131072

                Ergebnisse für (PChar)
Die Tests und Profilerläufe sind unter ähnlichen Bedingungen wie beim letzten Posting durchgeführt worden und stellen die Variante (IV) als die performanteste Variante dar.

Zur Erstellung der Ergebnisse habe ich den engehängten Quelltext unter D7 verwendet.
Angehängte Dateien
Dateityp: dpr project1_171.dpr (9,7 KB, 7x aufgerufen)
gruß, choose
  Mit Zitat antworten Zitat