(Публикация этого как отдельный ответ для сохранения отступа)
Испытательная установка ...
union {
char a[4];
uint32_t i;
} t;
t.i = 0xaabbccdd;
uint32_t v;
for (uint32_t i = 0; i < -1; ++i)
{
//v = ntohl (t.i); (1)
//v = ntoh32 (t.i); (2)
//v = ntoh_4b (t.a); (3)
}
разборка нто32 ...
movl %edi, -4(%rbp)
movl -4(%rbp), %eax
movl %eax, %edx
sall $24, %edx
movl -4(%rbp), %eax
andl $65280, %eax
sall $8, %eax
orl %eax, %edx
movl -4(%rbp), %eax
andl $16711680, %eax
shrl $8, %eax
orl %eax, %edx
movl -4(%rbp), %eax
shrl $24, %eax
orl %edx, %eax
leave
разборка ntoh_4b ...
movq %rdi, -8(%rbp)
movq -8(%rbp), %rax
movzbl (%rax), %eax
movzbl %al, %eax
movl %eax, %edx
sall $24, %edx
movq -8(%rbp), %rax
addq $1, %rax
movzbl (%rax), %eax
movzbl %al, %eax
sall $16, %eax
orl %eax, %edx
movq -8(%rbp), %rax
addq $2, %rax
movzbl (%rax), %eax
movzbl %al, %eax
sall $8, %eax
orl %eax, %edx
movq -8(%rbp), %rax
addq $3, %rax
movzbl (%rax), %eax
movzbl %al, %eax
orl %edx, %eax
leave
И, наконец, результаты. Я включил время для ntohl
библиотеки C, чтобы обеспечить базовый уровень для сравнения
//v = ntohl (t.i); (1)
real 0m35.030s
user 0m34.739s
sys 0m0.245s
//v = ntoh32 (t.i); (2)
real 0m36.272s
user 0m36.070s
sys 0m0.115s
//v = ntoh_4b (t.a); (3)
real 0m40.162s
user 0m40.013s
sys 0m0.097s