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?