c - 有什么方法可以使我的测试字符串相等性的函数更快?

标签 c performance

我想学习如何用 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,因为它根本没有任何作用。寄存器在任何优化级别都会被忽略。编译器在微优化方面比我或你更好 - 因此在适用时使用 constrestrict 帮助编译器优化器。

第二个可以简化。

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/

相关文章:

c - 将 char 数组的指针传递给函数

c - 使用 Xlib 生成 Perlin 噪声

c - 为什么数组扫描比 C 中指定的多 1 个元素

javascript - 此代码在片段中有效,但在博客中无效

performance - 等待 header 时超出客户端超时

node.js - Node.js 应用程序监控服务 - OpBeat 替代方案

从 C 中的虚拟地址计算物理地址

c - 在 GDB 中使用便利变量的地址

c++ - 在 C++ 中解析 float 函数

c# - 由于编译速度慢,使用大型 C# 解决方案的 TDD 几乎不可能