Ich war da etwas bequem und habe die Zeiten einfach mit dem Befehl time ermittelt, wobei das Programm den Suchvorgang 10000 Mal auf die selbe Datei angewandt hatte. Die Datei wurde zwischen den Suchvorgängen nicht geschlossen (rewind()). Die Zeitdifferenz dabei war etwa 50ms.
Der Assemblercode sagt mir jetzt nicht wirklich viel. Hier mal die langsame char Version:
.L157:
.loc 1 730 0 ; ri = wi;
movl -56(%rbp), %eax
movl %eax, -60(%rbp)
.loc 1 731 0 ; for( i = 0; i < 16; i++ ) {
movl $0, -52(%rbp)
jmp .L151
.L155:
.loc 1 732 0 ; if( (res = guid[i] - cbuf[ri++]) != 0 )
movl -52(%rbp), %eax
movslq %eax, %rdx
leaq guid.3222(%rip), %rax
movzbl (%rdx,%rax), %eax
movl %eax, %ecx
movl -60(%rbp), %eax
leal 1(%rax), %edx
movl %edx, -60(%rbp)
cltq
movzbl -48(%rbp,%rax), %eax
subl %eax, %ecx
movl %ecx, %eax
movb %al, -61(%rbp)
cmpb $0, -61(%rbp)
jne .L160
.loc 1 734 0 ; if( ri == 16 )
cmpl $16, -60(%rbp)
jne .L154
.loc 1 735 0 ; ri = 0;
movl $0, -60(%rbp)
.L154:
.loc 1 731 0 discriminator 2 ; for( i = 0; i < 16; i++ ) {
addl $1, -52(%rbp)
.L151:
.loc 1 731 0 is_stmt 0 discriminator 1 ;for( i = 0; i < 16; i++ ) {
cmpl $15, -52(%rbp)
jle .L155
jmp .L153
.L160:
.loc 1 733 0 is_stmt 1
nop
.L153:
.loc 1 737 0 ; if( res == 0 )
cmpb $0, -61(%rbp)
jne .L156
und hier die Abweichung bei der int Version:
.L155:
.loc 1 732 0 ; if( (res = guid[i] - cbuf[ri++]) != 0 )
movl -56(%rbp), %eax
movslq %eax, %rdx
leaq guid.3222(%rip), %rax
movzbl (%rdx,%rax), %eax
movsbl %al, %ecx
movl -64(%rbp), %eax
leal 1(%rax), %edx
movl %edx, -64(%rbp)
cltq
movzbl -48(%rbp,%rax), %eax
movsbl %al, %eax
subl %eax, %ecx
movl %ecx, %eax
movl %eax, -52(%rbp)
cmpl $0, -52(%rbp)
jne .L160
.loc 1 734 0
cmpl $16, -64(%rbp)
jne .L154
.loc 1 735 0
movl $0, -64(%rbp)
.L154:
Die einzige Merkwürdigkeit, die ich da entdecken kann ist dass die Variable res in der ersten Version offenbar eine ungerade Adresse (-61) bekommen hat.