Hallo Hagen,
gerne Teste auch auch ein bisschen Pointer-Arithmetik (nun immerhin Inkrementieren eines Pointers), allerdings wollte ich ursprünglich eine performante Lösung ohne
ASM und Pointer finden.
Der Vergleich mit dem bisherigen Favoriten (IV=PChar) und Deiner Implementierung (V=PArithm) bei dem geforderten Szenario
Code:
Created 131072 random strings (len: 8)
Each function (5) returns same result
PChar [Run 1]: 50 msec (2570039 per sec)
PChar [Run 2]: 30 msec (4228129 per sec)
PChar [Run 3]: 50 msec (2570039 per sec)
PChar [Run 4]: 30 msec (4228129 per sec)
PChar [Run 5]: 30 msec (4228129 per sec)
PChar [Run 6]: 50 msec (2570039 per sec)
PChar [Run 7]: 30 msec (4228129 per sec)
PChar [Run 8]: 50 msec (2570039 per sec)
PArithm [Run 1]: 40 msec (3196878 per sec)
PArithm [Run 2]: 51 msec (2520615 per sec)
PArithm [Run 3]: 50 msec (2570039 per sec)
PArithm [Run 4]: 50 msec (2570039 per sec)
PArithm [Run 5]: 40 msec (3196878 per sec)
PArithm [Run 6]: 60 msec (2148721 per sec)
PArithm [Run 7]: 40 msec (3196878 per sec)
PArithm [Run 8]: 50 msec (2570039 per sec)
sowie Strings der Länge 512
Code:
Created 131072 random strings (len: 512)
Each function (5) returns same result
PChar [Run 1]: 591 msec (221405 per sec)
PChar [Run 2]: 681 msec (192187 per sec)
PChar [Run 3]: 651 msec (201030 per sec)
PChar [Run 4]: 641 msec (204161 per sec)
PChar [Run 5]: 601 msec (217727 per sec)
PChar [Run 6]: 631 msec (207392 per sec)
PChar [Run 7]: 611 msec (214169 per sec)
PChar [Run 8]: 661 msec (197993 per sec)
PArithm [Run 1]: 1281 msec (102240 per sec)
PArithm [Run 2]: 1252 msec (104606 per sec)
PArithm [Run 3]: 1302 msec (100592 per sec)
PArithm [Run 4]: 1452 msec (90207 per sec)
PArithm [Run 5]: 1382 msec (94773 per sec)
PArithm [Run 6]: 1612 msec (81259 per sec)
PArithm [Run 7]: 1523 msec (86005 per sec)
PArithm [Run 8]: 1422 msec (92109 per sec)
Die Aufrufe innerhalb der Funktion (V) gestalten sich wie folgt
Code:
Routine Name | % Time w C | Hit Count
--------------+------------+----------
body only | 54,58 | 131072
LStrSetLength | 33,41 | 131072
LStrLen | 12,01 | 131072
Ergebnisse für (PArithm)
Anzumerken ist, dass die Lösung mithilfe der Pointer-Arithmetik zwar langsamer als Variante (IV) ist, allerdings ist sie ohne Zuhilfenahme von
API-Funktionen realisiert. Die Größenordnung der Geschwindkeit liegt bei der Lösung (II), was nicht weiter verwundert, weil der Delphi-Compiler Code erzeugt, der direkt mit den Offsets arbeitet (displacement über
EAX und
EBX) und nur unwesentlich durch den Aufruf von
UniqueString verlangsamt wird. Sollte also eine ähnliche Problemstellung vorliegen, für die keine optimierte
API-Funktion vorhanden ist, scheint diese etwas schnellere Version (V) oder die leicht übersichtlichere Variante (II) die bisher beste Wahl zu sein.
Vielleicht möchte noch jemand eine stark optimierte
ASM-Version einreichen (zB Einlesen eines DWords und der Prämisse, dass es sich um null-terminierte Strings handelt), damit wir die Ergebnisse des Threads komplettieren können?