Zitat von
sakura:
Zitat von
jbg:
Die Hilfsvariable Res ist eigentlich auch nicht notwendig, da man gleich mit Result arbeiten kann und sich somit am Ende den LStrAsg() Aufruf (=Zuweisung) sparen kann.
Dadurch wird allerdings das EAX Register blockiert, welches evtl. durch den Compiler anders für Optimierungen genutzt werden könnte. Es macht hier keinen Unterschied, ist i.A. aber nicht zu empfehlen. Result sollte nach Möglichkeit immer erst am Ende direkt angesprochen werden.
Da Result hierbei ein String ist, besteht da nicht das Problem mit dem blockierten EAX Register. Ohne die Hilfsvariable Res spart man sich zudem einen vom Compiler eingefügten try/finally-Block.
Folgende Funktion macht maximal 2 Speicherzugriffe pro Schleifendurchlauf (
BDS 2006)
Delphi-Quellcode:
function RemoveDblSpaces3(const InStr: string): string;
type
IntPtr = Integer;
var
LastIsSpace: Boolean;
IsSpace: Boolean;
Ch: Char;
PResult, PInStr: PChar;
begin
if InStr = '' then
begin
Result := '';
Exit;
end;
SetLength(Result, Length(InStr));
PInStr := Pointer(InStr);
PResult := Pointer(Result);
LastIsSpace := False;
while True do
begin
Ch := PInStr^;
if Ch = #0 then
Break;
IsSpace := Ch = #32;
if not (IsSpace and LastIsSpace) then
begin
PResult^ := Ch;
Inc(PResult);
end;
LastIsSpace := IsSpace;
Inc(PInStr);
end;
SetLength(Result, IntPtr(PResult) - IntPtr(Result));
end;
Kleine Statistik (darf natürlich jeder selbst nachprüfen):
Code:
Jasocul : 100.00% ( while Pos(' ') <> 0 ... )
sakura (1): 2.69%
sakura (2): 1.76%
jbg: : 1.22%