我想学习如何用 C 语言编写更快的代码,因此我编写并不断优化一个测试两个字符串是否相等的函数。
int stringsequal(register char *s1, register char *s2)
{
do
{
if(!(*s1 ^ 0)) return 1;
}
while(!(*(s1 ++) ^ *(s2 ++)));
return 0;
}
编辑:感谢您的反馈,我改进了我的代码!这是我的新代码:
int stringsequal(register char *s1, register char *s2)
{
while(1)
{
if(!((*s1 + *s2) ^ 0)) return 1;
if(*(s1 ++) ^ *(s2 ++)) break;
}
return 0;
}
编辑:如果我可以删除这个问题,我会的,很抱歉浪费了大家的时间。
最佳答案
你的第一个函数不起作用并且是错误的。
您的参数类型不正确。不要使用register
,因为它根本没有任何作用。寄存器在任何优化级别都会被忽略。编译器在微优化方面比我或你更好 - 因此在适用时使用 const
和 restrict
帮助编译器优化器。
第二个可以简化。
int stringsequal1(const char *restrict s1, const char *restrict s2)
{
do
{
if(*s1 != *s2) return 0;
}
while(*s1++ + *s2++);
return 1;
}
两者的结果代码是:
int stringsequal1(const char *s1, const char *s2)
{
do
{
if(*s1 != *s2) return 0;
}
while(*s1++ + *s2++);
return 1;
}
stringsequal1:
xor edx, edx
jmp .L11
.L15:
add rdx, 1
add eax, eax
je .L14
.L11:
movsx eax, BYTE PTR [rdi+rdx]
cmp al, BYTE PTR [rsi+rdx]
je .L15
mov eax, 1
ret
.L14:
ret
int stringsequal2(register char *s1, register char *s2)
{
while(1)
{
if(!((*s1 + *s2) ^ 0)) return 1;
if(*(s1 ++) ^ *(s2 ++)) break;
}
return 0;
}
stringsequal2:
xor eax, eax
jmp .L18
.L22:
add rax, 1
cmp cl, r9b
jne .L21
.L18:
movsx r8d, BYTE PTR [rdi+rax]
movsx r9d, BYTE PTR [rsi+rax]
mov ecx, r8d
add r8d, r9d
jne .L22
mov eax, 1
ret
.L21:
xor eax, eax
ret
关于c - 有什么方法可以使我的测试字符串相等性的函数更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52134966/