Code:
program StringReplace;
{$APPTYPE CONSOLE}
uses
Windows,
SysUtils,
Math;
{
Deze functies zijn toegevoegd om de tijd te kunnen meten die een bepaald
stukje code nodig heeft om uit te voeren. De Math unit is dan ook enkel nodig
voor TimeStop() (om de tijd weer te geven mbv RoundTo), dus indien je gebruik
maakt van Delphi versies die deze functie niet heeft, haal RoundTo weg en
verwijder de Math unit. Op het NLDelphi forum staat eventueel een vervanger
voor de RoundTo functie, zoek even op, jawel, 'RoundTo' :)
}
var
GFreq: Int64;
GTimer: Int64;
procedure TimeInit();
begin
QueryPerformanceFrequency(GFreq);
end;
procedure TimeStart();
begin
QueryPerformanceCounter(GTimer);
end;
procedure TimeStop();
var
iEnd: Int64;
begin
QueryPerformanceCounter(iEnd);
Dec(iEnd, GTimer);
WriteLn('Time taken: ', FloatToStr(RoundTo(iEnd / GFreq, -4)),
' second(s)');
GTimer := 0;
end;
{
Hier de functies die het echt werk doen, zowel op de traditionele als mijn
eigen wijze...
}
function ReplacePart(const ASource: String; const AStart, ALength: Integer;
const AReplace: String): String;
begin
Result := Copy(ASource, 1, AStart - 1) + AReplace +
Copy(ASource, AStart + ALength, MaxInt);
end;
function FastReplacePart(const ASource: String; const AStart, ALength: Integer;
const AReplace: String): String;
var
iSrcLength: Integer;
iLength: Integer;
iDiff: Integer;
iDest: Integer;
begin
iSrcLength := Length(ASource);
iLength := Length(AReplace);
iDiff := iLength - ALength;
iDest := 1;
SetLength(Result, iSrcLength + iDiff);
// Write first part
CopyMemory(@Result[iDest], @ASource[1], AStart - 1);
Inc(iDest, AStart - 1);
// Write replacement
CopyMemory(@Result[iDest], @AReplace[1], iLength);
Inc(iDest, iLength);
// Write last part
CopyMemory(@Result[iDest], @ASource[AStart + ALength],
iSrcLength - AStart - (ALength - 1));
end;
{
Hier de test-code die gebruikt is om te bepalen of het allemaal wel zin
heeft. Er is expres gekozen voor een redelijke string (10.000 bytes) om de
functies een beetje te stresstesten.
}
var
sTest: String;
sReplace: String;
iLoop: Integer;
begin
{ Als je wilt testen of de functies echt werken:
WriteLn(ReplacePart('Dit was een test!', 5, 3, 'is'));
WriteLn(FastReplacePart('Dit was een test!', 5, 3, 'is'));
ReadLn;
exit;
}
TimeInit();
sTest := StringOfChar('X', 10000);
sReplace := StringOfChar('Y', 200);
WriteLn('Testing 100.000 iterations - ReplacePart');
TimeStart();
for iLoop := 0 to 99999 do
ReplacePart(sTest, 5, 10, sReplace);
TimeStop();
WriteLn('Testing 100.000 iterations - FastReplacePart');
TimeStart();
for iLoop := 0 to 99999 do
FastReplacePart(sTest, 5, 10, sReplace);
TimeStop();
ReadLn;
end.
Bookmarks