[fpc-devel] CompareMem slower in FPC 2.4.4
Sven Barth
pascaldragon at googlemail.com
Thu Jun 2 17:49:52 CEST 2011
On 01.06.2011 22:07, Michalis Kamburelis wrote:
> Any thoughts? Maybe something can be improved?
>
> 1. Why CompareMem got slower in FPC 2.4.4? Maybe something can be fixed?
>
Let's see...
CompareMem in 2.4.2:
=== source begin ===
function CompareMem(P1, P2: Pointer; Length: cardinal): Boolean;
var
i: cardinal;
begin
Result:=True;
I:=0;
If (P1)<>(P2) then
While Result and (i<Length) do
begin
Result:=PByte(P1)^=PByte(P2)^;
Inc(I);
Inc(pchar(P1));
Inc(pchar(P2));
end;
end;
=== source end ===
CompareMem in 2.4.4:
=== source begin ===
function CompareMem(P1, P2: Pointer; Length: cardinal): Boolean;
begin
Result:=CompareByte(P1^,P2^,Length)=0;
end;
=== source end ===
This at least explains why CompareMem behaves similar to CompareByte in
your test :D
> 2. The simple comparison "(V1[0] = V2[0]) and..." is much faster than
> any CompareXxx. Any chance of improving it? In this case, size is known
> at compile time, so maybe CompareXxx could be "magic" and (for
> reasonably small sizes) the compiler could just generate a proper code
> to compare them just like "=" operator? Just an idea of course, I don't
> know how easy it would be to actually implement.
The CompareMem function is in unit SysUtils and I don't think it is a
good idea to "magicalize" that unit.
Maybe it's better if you or someone else would try to improve the
performance of the i386 assembler code that makes up the
Compare(Byte/Word/DWord) functions (it's located in rtl/i386/i386.inc btw).
Regards,
Sven
More information about the fpc-devel
mailing list