AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

PosEx? Oder doch lieber Pos? - Performance!

Ein Thema von dGeek · begonnen am 22. Aug 2016 · letzter Beitrag vom 24. Aug 2016
Antwort Antwort
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.039 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

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

  Alt 23. Aug 2016, 07:40
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?
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (23. Aug 2016 um 07:44 Uhr)
  Mit Zitat antworten Zitat
dGeek
(Gast)

n/a Beiträge
 
#2

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

  Alt 23. Aug 2016, 10:07
in XE schien Pos enorm langsam zu sein und nicht etwa PosEx schneller
Also entweder bin ich müde, oder ich beherrsche die deutsche Sprache nicht. Ist das hier nicht doppelt gemoppelt?
Du sagst, Pos scheint enorm langsam zu sein, und dass PosEx nicht schneller ist. Was ist denn nun schneller gewesen bei deinem Test
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.039 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#3

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

  Alt 23. Aug 2016, 10:35
in XE schien Pos enorm langsam zu sein und nicht etwa PosEx schneller
Also entweder bin ich müde, oder ich beherrsche die deutsche Sprache nicht. Ist das hier nicht doppelt gemoppelt?
Du sagst, Pos scheint enorm langsam zu sein, und dass PosEx nicht schneller ist. Was ist denn nun schneller gewesen bei deinem Test
Ich wollte damit deine Aussage
Ich habe entdeckt, dass PosEx() viel schneller arbeitet als Pos().
in Relation zu den neueren Delphi Versionen stellen - insofern: Pos (in XE) arbeitet viel langsamer als PosEx (was genauso schnell arbeitet wie Pos in neueren Versionen).

In Spring haben wir übrigens folgenden Code:
Delphi-Quellcode:
{$IFNDEF DELPHIXE3_UP}
function Pos(const SubStr, Str: UnicodeString; Offset: Integer): Integer;
asm
  jmp PosEx
end;
{$ENDIF}
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (23. Aug 2016 um 10:37 Uhr)
  Mit Zitat antworten Zitat
dGeek
(Gast)

n/a Beiträge
 
#4

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

  Alt 23. Aug 2016, 10:39
Ok interessant.

Zur Frage, welchen offSet ich bei PosEx verwenden würde: ich benutze gar keinen. Ich gebe keinen an, also gilt 1.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

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

  Alt 23. Aug 2016, 11:43
Ich habe Günthers Code mit kleinen Abweichungen (TStopwatch ist unbekannt)
durch D2006 und D7 gejagt


D2006 pos: 0,024 posex:0,024 s

D7 pos:0,152 posex 0,147 s

und hier der code:
Delphi-Quellcode:
program Project2;

{$APPTYPE CONSOLE}

{$R *.res}

uses SysUtils
 ,strutils
 ;

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

  count = 2E6;

//{$Define Posex}

var
    times: Integer;
    result: Integer;
    sz,ez : tdatetime;
begin
    times := 0;
    sz:=now;
    repeat
       {$If Defined(Posex)}
          result := PosEx(s2, s1);
       {$Else}
          result := System.Pos(s2, s1);
       {$IFEnd}
       Inc(times);
    until (times = count);
    ez:=now;

    Writeln(formatdatetime('HH:MM:SS,zz', ez-sz) );
    readln;
end.
Packt man noch 40 Leerzeichen an den Anfang von S1, dann ist das Verhältnis 0,201/0,198.
Es scheint wohl wieder zu gelten: "wer misst, misst Mist"


Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector

Geändert von p80286 (23. Aug 2016 um 11:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.039 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#6

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

  Alt 23. Aug 2016, 12:00
Beides Pre-Unicode Versionen, somit: Äpfel <> Birnen

Außerdem ist mit Now messen auch Tinnef.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#7

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

  Alt 23. Aug 2016, 12:26
In beiden Fällen werden Ansis verglichen, das sind Äpfel oder Birnen aus dem gleichen Korb.
Die Ausgangsfrage war gibt es einen Unterschied zwischen pos und posex, was implizit "beim gleichen Compiler beinhaltet"?
Und im Rahmen der Meßgenauigkeit kann ich Dir sagen für D2006 und D7 gilt nein.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Pixel

Registriert seit: 23. Aug 2016
26 Beiträge
 
#8

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

  Alt 23. Aug 2016, 22:39
..........nvm

Geändert von Pixel (23. Aug 2016 um 23:34 Uhr)
  Mit Zitat antworten Zitat
Pixel

Registriert seit: 23. Aug 2016
26 Beiträge
 
#9

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

  Alt 24. Aug 2016, 20:12
Also ich bin kein ASM-Experte aber hab mir das ganze mal im Debugger angeschaut.

Bilder sind im Anhang.

Bei dem Bild "pos" sieht man den kompletten ASM-Code der pos-funktion

Die Stringsuche beginnt bei Adresse 00402FE8 "REPNE SCAN BYTE PTR..."
Der ASM-Befehl sucht quasi solange nach einem String bis ECX 0 ist.

Bei Bild "posex_main" fällt erstmal auf dass die Funktion anders anfängt. Von der Stringsuchschleife von pos() sieht man erstmal nichts. Aber: z.B. gibt es bei PosEx() ja den 3. Parameter "Offset" der default auf 1 gesetzt ist. Das sieht man auf dem Bild schön bei Adresse 00407CB1 "CMP ECX,1" und "JNZ SHRT findPosi.00407CC1".

Wenn man das Offset unberührt lässt (also bei default 1) dann wird der jump JNZ - "jump if not zero" auch nicht genommen und wir landen bei Adresse 00407CBA "CALL findPosi.0040398C". Wenn man dem folgt landet man bei Bild "posex2" und jetzt erkennt man, dass wir dort dann wieder bei der Funktion pos() sind.

Also tl;dr: posEx() hat einen jump, ein CMP und ein JNZ mehr als pos() und ist somit langsamer . posEx() kann allerdings schneller sein, wenn man das Offset setzt. Ach und: Das ganze hab ich aus Delphi 7

Edit:// Sorry ich wollte eigtl. meinen Beitrag oben editieren.
Angehängte Grafiken
Dateityp: png pos.png (20,0 KB, 14x aufgerufen)
Dateityp: png posex_2.png (13,7 KB, 14x aufgerufen)
Dateityp: png posex_main.png (24,2 KB, 13x aufgerufen)

Geändert von Pixel (24. Aug 2016 um 20:19 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:41 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz