X[]==Y[] is 7X slower than it should be -- why?
Jarrett Billingsley
kb3ctd2 at yahoo.com
Fri Jun 27 07:00:30 PDT 2008
"Bruce Adams" <tortoise_74 at yeah.who.co.uk> wrote in message
news:op.udecoog1xikks4 at starquake.cybernetics...
On Fri, 20 Jun 2008 18:40:25 +0100, Jarrett Billingsley
<kb3ctd2 at yahoo.com> wrote:
> extern (C) int _adEq(Array a1, Array a2, TypeInfo ti)
> {
> if (a1.length != a2.length)
> return 0;
>
> auto sz = ti.tsize();
> auto p1 = a1.ptr;
> auto p2 = a2.ptr;
>
> if (sz == 1)
> // We should really have a ti.isPOD() check for this
> return (memcmp(p1, p2, a1.length) == 0);
>
> for (size_t i = 0; i < a1.length; i++)
> {
> if (!ti.equals(p1 + i * sz, p2 + i * sz))
> return 0;
> }
>
> return 1;
> }
>
there is no guarantee that memcpy will return the same result as opEquals.
...
Why has no-one screamed about this before?
-----------------
Because that's not how the above function works? It only calls memcmp if
the compared array has elements of size 1 -- that is, byte[], ubyte[], and
char[]. For all other types, it calls ti.equals, which will call the opCmp
method of classes/structs, if any.
More information about the Digitalmars-d
mailing list