![]() |
Re: [Assembler]: 2 Variabeln austauschen
Zitat:
Zitat:
Zitat:
Hier mal ein Auszug aus meinem Code aus den Indy-Komponentnen (IdGlobal.pas). Würden die lokalen Find() und FindNext() ge-inlined wäre der Code um ein ganzes Stück langsamer, weil der Compiler das ESI Register im Inline-Code nicht verweden kann und somit bei jedem Schleifendurchlauf den PChar-Zeiger neu aus dem Speicher einliest und danach wieder dorthin schreibt (2 Speicherzugriffe mehr pro Schleifendurchlauf).
Delphi-Quellcode:
function PosIdx(const ASubStr, AStr: AnsiString; AStartPos: Cardinal): Cardinal;
// use best register allocation on Win32 function Find(AStartPos, EndPos: Cardinal; StartChar: AnsiChar; const AStr: AnsiString): Cardinal; begin for Result := AStartPos to EndPos do if AStr[Result] = StartChar then Exit; Result := 0; end; // use best register allocation on Win32 function FindNext(AStartPos, EndPos: Cardinal; const AStr, ASubStr: AnsiString): Cardinal; begin for Result := AStartPos + 1 to EndPos do if AStr[Result] <> ASubStr[Result - AStartPos + 1] then Exit; Result := 0; end; var StartChar: AnsiChar; LenSubStr, LenStr: Cardinal; EndPos: Cardinal; begin if AStartPos = 0 then AStartPos := 1; Result := 0; LenSubStr := Length(ASubStr); LenStr := Length(AStr); if (LenSubStr = 0) or (AStr = '') or (LenSubStr > LenStr - (AStartPos - 1)) then Exit; StartChar := ASubStr[1]; EndPos := LenStr - LenSubStr + 1; if LenSubStr = 1 then Result := Find(AStartPos, EndPos, StartChar, AStr) else begin repeat Result := Find(AStartPos, EndPos, StartChar, AStr); if Result = 0 then Break; AStartPos := Result; Result := FindNext(Result, AStartPos + LenSubStr - 1, AStr, ASubStr); if Result = 0 then begin Result := AStartPos; Exit; end else Inc(AStartPos); until False; end; end; |
Re: [Assembler]: 2 Variabeln austauschen
Vielen dank :-D
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:51 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-2025 by Thomas Breitkreuz