Jas*_*son 1 c performance gcc x86-64 micro-optimization
我有2个(strcpy)函数的源代码,我想知道哪一个更快,性能更高...
unsigned
strcpy(const char * str, char * des) {
register const char * ptr = str;
while ((*des = *str)) {
str++;
des++;
}
return (str - ptr);
}
unsigned
strcpy2(const char * str, char * des) {
register unsigned i = 0;
while ((des[i] = str[i])) i++;
return i;
}
Run Code Online (Sandbox Code Playgroud)
第一个使用str和des地址,第二个使用索引...第一个使用多余的(++),因此在第一眼看来,由于执行了额外的操作(++),第一个功能的性能低于第二个)中的每个字符,但是当我在GCC中使用(-O3)优化时,结果(汇编代码)告诉我其他信息(第一个strcpy具有更高的性能和更少的动作)
strcpy:
movzbl (%rdi), %eax
movb %al, (%rsi)
testb %al, %al
je .L4
movq %rdi, %rax
.L3:
movzbl 1(%rax), %edx
addq $1, %rax
addq $1, %rsi
movb %dl, (%rsi)
testb %dl, %dl
jne .L3
subl %edi, %eax
ret
.L4:
xorl %eax, %eax
ret
strcpy2:
movzbl (%rdi), %eax
testb %al, %al
movb %al, (%rsi)
movl $0, %eax
je .L10
.L9:
leal 1(%rax), %ecx
movzbl (%rdi,%rcx), %edx
movq %rcx, %rax
movb %dl, (%rsi,%rcx)
testb %dl, %dl
jne .L9
ret
.L10:
ret
Run Code Online (Sandbox Code Playgroud)
是真的吗 第一个strcpy具有更高的性能(性能=更少的动作和更快的速度)?
没关系。两者可能都比标准库的strcpy慢。如果您自己没有实现strcpy,那么GCC会做好的内联代码。
现代CPU的性能瓶颈是缓存和RAM带宽,而不是操作码。