
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@main: ; Line 39 cmp edi, DWORD PTR _id2$[esp+40] jne SHORT $LN8@main cmp edi, DWORD PTR _id2$[esp+44] jne SHORT $LN8@main cmp edi, DWORD PTR _id2$[esp+48] jne SHORT $LN8@main cmp edi, DWORD PTR _id2$[esp+52] jne SHORT $LN8@main mov ecx, 1 jmp SHORT $LN9@main $LN8@main: xor ecx, ecx $LN9@main: movzx ecx, cl ; Line 42 mov edx, eax add esi, ecx and edx, -2147483633 ; 8000000fH jns SHORT $LN38@main dec edx or edx, -16 ; fffffff0H inc edx $LN38@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@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://lists.boost.org/mailman/listinfo.cgi/boost