X[]==Y[] is 7X slower than it should be -- why?

Unknown W. Brackets unknown at simplemachines.org
Fri Jun 20 12:56:15 PDT 2008


This strikes me as fairly significant for, e.g., string comparison.  Am 
I crazy?

-[Unknown]


Jarrett Billingsley wrote:
> "Don" <nospam at nospam.com.au> wrote in message 
> news:g3ggq5$ui5$1 at digitalmars.com...
> 
>> What's it doing? Is it doing a byte-by-byte comparison? (it shouldn't do 
>> that even for strings). Is it doing bounds checking for every array 
>> element?? (even with -release -O)
> 
> See dmd/src/phobos/internal/adi.d  The important function here is:
> 
> 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;
> }
> 
> If the size of an element is 1 (bytes, chars, bools), it just does memcmp. 
> There's even a comment in there that memcmp should be used if the type is 
> POD (plain old data, which uints are).  But otherwise, it uses the RTTI 
> .equals function to compare the elements, and it doesn't even use parallel 
> pointers, it does manual indexing for each element.  .equals will, for 
> uints, just return true if they are equal.
> 
> What flabbergasts me is that in the uint[] typeinfo class, there is an 
> equals method that uses memcmp, but it's not used unless you explicitly call 
> it (or if you have a uint[][]).  Try doing
> 
> bool b = typeid(uint[]).equals(&X[], &Y[]);
> 
> and see what kind of performance you get. 
> 
> 



More information about the Digitalmars-d mailing list