Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi PosEx? Oder doch lieber Pos? - Performance! (https://www.delphipraxis.net/190021-posex-oder-doch-lieber-pos-performance.html)

dGeek 22. Aug 2016 18:01


PosEx? Oder doch lieber Pos? - Performance!
 
Ich habe heute eine sehr interessante Entdeckung gemacht. Ihr habt sie wahrscheinlich schon vor langer Zeit gemacht, ich leider erst eben.
Ich habe entdeckt, dass PosEx() viel schneller arbeitet als Pos().

1.000.000 Mal
Delphi-Quellcode:
if Pos(IrgendeinString, UndNochIrgendeinString) > 1
werden bei mir innerhalb von circa 570 Millisekunden abgearbeitet.
Dasselbe mit PosEx jedoch innerhalb von circa 140 Millisekunden.

Sollte man demnach lieber PosEx() benutzen statt Pos()?

Der schöne Günther 22. Aug 2016 18:12

AW: PosEx? Oder doch lieber Pos? - Performance!
 
Machst du in deinem Programm wirklich 1 Mio mal hintereinander Posex oder auf mehrere Jahrzehnte verteilt? Mir persönlich ist das eigentlich immer ziemlich egal ob irgendein Wartevorgang für ein "Ich klicke auf irgendwas" nun 30 oder 31 Millisekunden dauert.

Und ja, technisch gesehen ist dieser Beitrag nicht hilfreich.

dGeek 22. Aug 2016 18:14

AW: PosEx? Oder doch lieber Pos? - Performance!
 
Selbstverständlich mache ich das nicht. Aber ich fand es schon interessant, dass PosEx() um den Faktor 3 schneller ist.

Helmi 22. Aug 2016 18:15

AW: PosEx? Oder doch lieber Pos? - Performance!
 
was gibst du denn bei PosEx als Offset an?

Der schöne Günther 22. Aug 2016 18:18

AW: PosEx? Oder doch lieber Pos? - Performance!
 
Also eine Millionen mal dauert Posex bei mir 6 Millisekunden und 7 Millisekunden für "Pos".

Delphi-Quellcode:
program Project11;

{$APPTYPE CONSOLE}

{$R *.res}

uses System.SysUtils, System.AnsiStrings, System.Diagnostics;

const
 s1 = 'Hallo Welt';
 s2 = 'lo';

 count = 1E6;

//{$Define Posex}

var
   times: Integer;
   result: Integer;
   stopWatch: TStopwatch;
begin
   times := 0;
   stopWatch := TStopwatch.StartNew();
   repeat
      {$If Defined(Posex)}
         result := System.AnsiStrings.PosEx(s2, s1);
      {$Else}
         result := System.Pos(s2, s1);
      {$EndIf}
      Inc(times);
   until (times = count);
   stopWatch.Stop();

   Writeln( stopWatch.ElapsedMilliseconds );
   readln;
end.

Wenn du in die Implementation schaust wirst du sehen dass PosEx nichts anderes tut als Pos aufzurufen. PosEx hat aber noch eine "inline"-Direktive. Ich kann kein Assembler lesen, könnte mir aber vorstellen dass der Compiler dann das komplette "Pos" inlined sodass er sich einen Sprung spart. Könnte das mal jemand prüfen?

dGeek 22. Aug 2016 18:39

AW: PosEx? Oder doch lieber Pos? - Performance!
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1345430)
Also eine Millionen mal dauert Posex bei mir 6 Millisekunden und 7 Millisekunden für "Pos".


- Wir haben nicht dieselbe Delphi-Version
- Wir haben nicht denselben Computer

:lol:

p80286 22. Aug 2016 22:27

AW: PosEx? Oder doch lieber Pos? - Performance!
 
Zitat:

Zitat von dGeek (Beitrag 1345432)
Zitat:

Zitat von Der schöne Günther (Beitrag 1345430)
Also eine Millionen mal dauert Posex bei mir 6 Millisekunden und 7 Millisekunden für "Pos".


- Wir haben nicht dieselbe Delphi-Version
- Wir haben nicht denselben Computer

:lol:

Welche Delphi-Version hast Du denn?

Gruß
K-H

dGeek 22. Aug 2016 22:36

AW: PosEx? Oder doch lieber Pos? - Performance!
 
XE2 benutze ich.

Zacherl 23. Aug 2016 00:19

AW: PosEx? Oder doch lieber Pos? - Performance!
 
In den neuen Delphi Versionen scheint
Delphi-Quellcode:
PosEx
nur noch ein Alias für
Delphi-Quellcode:
Pos
zu sein. Früher hatte
Delphi-Quellcode:
Pos
noch nicht den optionalen
Delphi-Quellcode:
Offset
Parameter, deshalb brauchte man eine seperate
Delphi-Quellcode:
PosEx
Funktion.

Stevie 23. Aug 2016 06:40

AW: PosEx? Oder doch lieber Pos? - Performance!
 
Ich hab mal dem Code von Günther in XE und Berlin getestet und muss sagen, in XE (und vermutlich dann auch XE2) schien Pos enorm langsam zu sein und nicht etwa PosEx schneller (im Vergleich zu den Ergebnissen in Berlin)

P.S. Ich hab natürlich die Unicode Version von PosEx aus StrUtils verwendet und nicht die AnsiString Version - wir wollen ja nicht Äpfel und Birnen vergleichen, gell? :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:07 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz