Subject: Re: [boost] [uuids] On boost::uuids::uuid operator == performance.
From: Peter Dimov (pdimov_at_[hidden])
Date: 2012-04-16 11:16:28


Michael Kochetkov wrote:
...
> int main() {
> uint8_t d1[16], d2[16];
> return memcmp(d1,d2,16);
> }
> Here is the result.
>
> $LL4_at_main:
> mov esi, DWORD PTR [edx]
> cmp esi, DWORD PTR [ecx]
> jne SHORT $LN5_at_main
> sub eax, 4
> add ecx, 4
> add edx, 4
> cmp eax, 4
> jae SHORT $LL4_at_main
> xor eax, eax
>
> Pretty neat.

That's not what I see for the following:

int main()
{
    boost::uuids::uuid id1, id2;
    return memcmp( id1.data, id2.data, 16 );
}

even though uuid::data is uint8_t[16]. I see an assembly listing that is
virtually identical to the one you posted for _Equal, which is also just a
memcmp call:

inline bool __CLRCALL_OR_CDECL _Equal(const unsigned char *_First1,
    const unsigned char *_Last1, const unsigned char *_First2,
    random_access_iterator_tag, _Range_checked_iterator_tag)
    { // compare [_First1, _Last1) to [First2, ...), for unsigned chars
#if _HAS_ITERATOR_DEBUGGING
    _DEBUG_RANGE(_First1, _Last1);
    if (_First1 != _Last1)
        _DEBUG_POINTER(_First2);
#endif /* _HAS_ITERATOR_DEBUGGING */

    return (::memcmp(_First1, _First2, _Last1 - _First1) == 0);
    }

I'm using VC++2005 though.

Although in both cases, the loop that is actually executed is identical to
the one you give above.