我有两个(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;
}第一个使用字符串和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这是真的吗?第一个strcpy有更多的性能(性能=更少的动作和更快)?
发布于 2019-08-02 19:38:38
不要紧。两者都可能比Standard库中的strcpy慢。如果你不自己实现strcpy,那么这个GCC将会做很好的内联代码。
现代CPU的性能瓶颈是Cache和RAM带宽,而不是操作码。
发布于 2019-08-02 20:24:21
第二个摘录是invalid for copying a string。您在指针为64位的平台上使用32位unsigned int。因此,编译器需要非常小心地使用,以便在索引中使用32位模算术。如果您按照应该的方式将i更改为size_t,那么编译器就可以消除零扩展和LEA。
在任何情况下,您的版本总是比编译器版本慢-因为在编译器中,strcpy是一个内部函数-编译器可以知道用memcpy甚至替换它,只需将单个字符加载到寄存器中,而不是无意地将一些字节从内存的一部分复制到另一部分。
https://stackoverflow.com/questions/57325624
复制相似问题