From: Brandon
Function Reverse(S: String): String;
var
Ptr: ^Char;
I, L: Integer;
Begin
L := Length(S);
SetLength(Result, L);
Ptr := @S[L + 1];
For I := 1 To L Do
Result[I] := (Ptr := Ptr - 1)^;
End;
Dang, I was kinda waiting for Brandon to popup here…
..and so he did.
That is a fast and clever solution man, woah!
Included to the timing script:
procedure string.reverse();
var
temp_str: string;
i, l, l2: integer;
begin
temp_str := self;
l := length(self);
l2 := l;
for i := 1 to l do
begin
self[i] := temp_str[l2];
l2 := l2-1;
end;
end;
procedure string.reverse2();
var
i, l, half: Integer;
begin
l := Length(Self);
half := l div 2;
Inc(l);
for i := 1 to half do
begin
Self[i] := Char(Byte(Self[i]) xor Byte(Self[l - i]));
Self[l - i] := Char(Byte(Self[i]) xor Byte(Self[l - i]));
Self[i] := Char(Byte(Self[i]) xor Byte(Self[l - i]));
end;
end;
function Reverse(str: string): string;
var
i, l: Integer;
begin
l := Length(str);
SetLength(Result, l);
for i := l downto 1 do
Result[i] := str[((l - i) + 1)];
end;
function Reverse2(str: string): string;
var
i, l, half: Integer;
begin
l := Length(str) + 1;
SetLength(Result, l - 1);
half := Floor(l / 2);
for i := 1 to half do
begin
Result[i] := str[l - i];
Result[l - i] := str[i];
end;
end;
function Reverse3(str: string): string;
var
h, i, l: Integer;
begin
l := (Length(str) + 1);
SetLength(Result, (l - 1));
h := (l div 2);
for i := 1 to h do
begin
Result[i] := str[((l - i))];
Result[((l - i))] := str[i];
end;
end;
Function Reverse4(S: String): String;
var
Ptr: ^Char;
I, L: Integer;
Begin
L := Length(S);
SetLength(Result, L);
Ptr := @S[L + 1];
For I := 1 To L Do
Result[I] := (Ptr := Ptr - 1)^;
End;
var
str, tmp, m: string;
t, i: Integer;
begin
ClearDebug;
str := (StringOfChar('A', 5000000) + StringOfChar('B', 5000000) + StringOfChar('C', 5000000));
t := GetTimeRunning;
tmp := Reverse(str);
t := (GetTimeRunning - t);
m := MD5(tmp);
WriteLn('Reverse: ' + IntToStr(t) + ' ms. [' + m + ']');
t := GetTimeRunning;
tmp := Reverse2(str);
t := (GetTimeRunning - t);
m := MD5(tmp);
WriteLn('Reverse2: ' + IntToStr(t) + ' ms. [' + m + ']');
t := GetTimeRunning;
tmp := Reverse3(str);
t := (GetTimeRunning - t);
m := MD5(tmp);
WriteLn('Reverse3: ' + IntToStr(t) + ' ms. [' + m + ']');
t := GetTimeRunning;
tmp := Reverse4(str);
t := (GetTimeRunning - t);
m := MD5(tmp);
WriteLn('Reverse4: ' + IntToStr(t) + ' ms. [' + m + ']');
tmp := str;
t := GetTimeRunning;
tmp.reverse;
t := (GetTimeRunning - t);
m := MD5(tmp);
WriteLn('string.reverse: ' + IntToStr(t) + ' ms. [' + m + ']');
tmp := str;
t := GetTimeRunning;
tmp.reverse2;
t := (GetTimeRunning - t);
m := MD5(tmp);
WriteLn('string.reverse2: ' + IntToStr(t) + ' ms. [' + m + ']');
end.
Results for me turned out like this:
Reverse: 1857 ms. [47A75DD9F3E0DFA21C401ADAD158B815]
Reverse2: 1950 ms. [47A75DD9F3E0DFA21C401ADAD158B815]
Reverse3: 1950 ms. [47A75DD9F3E0DFA21C401ADAD158B815]
Reverse4: 1638 ms. [47A75DD9F3E0DFA21C401ADAD158B815]
string.reverse: 2044 ms. [47A75DD9F3E0DFA21C401ADAD158B815]
string.reverse2: 4618 ms. [47A75DD9F3E0DFA21C401ADAD158B815]
Looks like it wins easily, sweet.