$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
Subject: Re: [boost] [uuids] On boost::uuids::uuid operator == performance.
From: Michael Kochetkov (michael.kv_at_[hidden])
Date: 2012-04-16 14:31:00
> Interestingly, if I try the following program, the "stupid" my_memcmp
> produces the fastest result.
My results for your code are:
Eq16                    -- 100%
my_memcmp -- 119,46 %
memcmp          -- 153.94 %
operator ==     -- 181.03 %
I cannot see how it may be in your case other then:
1. You are wrong about your results.
2. VS2005 has very small default alignment.
For the second case you may add
#pragma pack(push,16)
#pragma pack(pop)
in the proper
#if defined(_MSC_VER)
sections in uuid.hpp.
BTW if you are interested in the final result you do need to initialize your
uuids with some random values. VC initializes all bytes with zeros and is
smart enough to remember that id1 does not change:
        xor	edi, edi
        mov	DWORD PTR _id2$[esp+40], eax
        mov	DWORD PTR _id2$[esp+44], eax
        mov	DWORD PTR _id2$[esp+48], eax
        mov	DWORD PTR _id2$[esp+52], eax
....
$LN3_at_main:
; Line 39
        cmp	edi, DWORD PTR _id2$[esp+40]
        jne	SHORT $LN8_at_main
        cmp	edi, DWORD PTR _id2$[esp+44]
        jne	SHORT $LN8_at_main
        cmp	edi, DWORD PTR _id2$[esp+48]
        jne	SHORT $LN8_at_main
        cmp	edi, DWORD PTR _id2$[esp+52]
        jne	SHORT $LN8_at_main
        mov	ecx, 1
        jmp	SHORT $LN9_at_main
$LN8_at_main:
        xor	ecx, ecx
$LN9_at_main:
        movzx	ecx, cl
; Line 42
        mov	edx, eax
        add	esi, ecx
        and	edx, -2147483633			; 8000000fH
        jns	SHORT $LN38_at_main
        dec	edx
        or	edx, -16				; fffffff0H
        inc	edx
$LN38_at_main:
        add	BYTE PTR _id2$[esp+edx+40], al
        lea	ecx, DWORD PTR _id2$[esp+edx+40]
        inc	eax
        cmp	eax, 100000000				; 05f5e100H
        jl	SHORT $LN3_at_main
as you may see edi never changes and VC event do not bother itself to
allocate memory for id1. All id1 bytes are represented with edi.
--
Michael Kochetkov
> 
> #include <boost/uuid/uuid.hpp>
> 
> #include <iostream>
> 
> #include <windows.h>
> #include <mmsystem.h>
> 
> typedef unsigned uint32_t;
> 
> inline bool Eq16( unsigned char const * p, unsigned char const * q ) {
>     return *reinterpret_cast<const uint32_t*>( p   ) ==
> *reinterpret_cast<const uint32_t*>( q   )
>         && *reinterpret_cast<const uint32_t*>( p+4 ) ==
> *reinterpret_cast<const uint32_t*>( q+4 )
>         && *reinterpret_cast<const uint32_t*>( p+8 ) ==
> *reinterpret_cast<const uint32_t*>( q+8 )
>         && *reinterpret_cast<const uint32_t*>( p+12) ==
> *reinterpret_cast<const uint32_t*>( q+12); }
> 
> inline bool my_memcmp( unsigned char const * p, unsigned char const * q,
> size_t n ) {
>     for( size_t i = 0; i < n; ++i )
>     {
>         if( p[i] != q[i] ) return false;
>     }
> 
>     return true;
> }
> 
> int main()
> {
>     boost::uuids::uuid id1 = {}, id2 = {};
> 
>     int const N = 100000000;
> 
>     DWORD t1 = timeGetTime();
> 
>     int s = 0;
> 
>     for( int i = 0; i < N; ++i )
>     {
>         //s += ( id1 == id2 );
>         //s += Eq16( id1.data, id2.data );
>         //s += memcmp( id1.data, id2.data, 16 );
>         s += my_memcmp( id1.data, id2.data, 16 );
>         id2.data[ i % 16 ] += i & 0xFF;
>     }
> 
>     DWORD t2 = timeGetTime();
> 
>     std::cout << s << ": " << t2 - t1 << std::endl; }
> 
> 
> _______________________________________________
> Unsubscribe & other changes:
> http://listarchives.boost.org/mailman/listinfo.cgi/boost