
AMDG Kevin Sopp wrote:
Interesting, I wrote a modified version where you can enter the string length and the sentinel version is consistently slower (using gcc-4.4.0 with -O3).
{ boost::timer t; for( unsigned i = 0; i < N; ++i ) { m1 += test_strlen( text ); }
std::cout << "strlen: " << t.elapsed() << " " << m1 << std::endl; }
I'm not absolutely sure about this, but from the assembler it looks like the call to strlen is being pulled out of the loop. movl 24(%esp), %eax movb $0, (%eax,%edx) call _clock movl %eax, 20(%esp) xorl %eax, %eax orl $-1, %ecx movl 24(%esp), %edi repne scasb // This looks like strlen notl %ecx movl 24(%esp), %eax leal -1(%eax,%ecx), %esi xorl %edi, %edi movl $0, 28(%esp) .p2align 2,,3 L11: // and the loop is here cmpl %esi, 24(%esp) je L32 movl 24(%esp), %edx xorl %eax, %eax .p2align 2,,3 L10: movsbl (%edx),%ebx movl %eax, %ecx sall $6, %ecx leal -1640531527(%ebx,%ecx), %ebx movl %eax, %ecx shrl $2, %ecx leal (%ebx,%ecx), %ecx xorl %ecx, %eax incl %edx cmpl %esi, %edx jne L10 addl %eax, 28(%esp) incl %edi cmpl $1000000, %edi jne L11 In Christ, Steven Watanabe