为什么strcmp比我的函数快得多?

恩里·范

我写了一个函数,该函数Str::Compare基本上是strcmp用另一种方式重写的。在比较这两个函数时,在重复strcmp执行500'000'000次的循环中,执行速度太快,大约快了750倍。

这段代码是在C库中使用-Os有效参数编译的

int Str::Compare(char* String_1, char* String_2)
{
    char TempChar_1, TempChar_2;

   do
   {
        TempChar_1 = *String_1++;
        TempChar_2 = *String_2++;
   } while(TempChar_1 && TempChar_1 == TempChar_2);

   return TempChar_1 - TempChar_2;
}

该函数的执行时间3.058s,而strcmp0.004s

为什么会这样呢?

这也是我实现基准循环的方式:

int main()
{
     char Xx[] = {"huehuehuehuehuehuehuehuehuehuehuehuehuehue"},
          Yy[] = {"huehuehuehuehuehuehuehuehuehuehuehuehuehue"};
     for(int i = 0; i < 500000000; ++i)
         Str::Compare(Xx, Yy);
}

编辑:在测试一些代码时,我编写了代码,并进行了优化,从而极大地提高了Str::Compare速度。如果说之前strcmpX750倍的速度现在只有X250这是新代码:

int Str::Compare(char* String_1, char* String_2)
{
     char TempChar_1, TempChar_2, TempChar_3;

     while(TempChar_1 && !TempChar_3)
     {
          TempChar_1 = *String_1++;
          TempChar_2 = *String_2++;
          TempChar_3 = TempChar_1 ^ TempChar_2;
     }

     return TempChar_1 - TempChar_2;
}

新的执行时间为0.994s

wi

我对此很好奇,并构建了一个测试程序:

#include <string.h>

compare(char* String_1, char* String_2)
{
    char TempChar_1,
         TempChar_2;

   do
   {
        TempChar_1 = *String_1++;
        TempChar_2 = *String_2++;
   } while(TempChar_1 && TempChar_1 == TempChar_2);

   return TempChar_1 - TempChar_2;
}


int main(){
    int i=strcmp("foo","bar");
    int j=compare("foo","bar");

    return i;
}

gcc -S -Os test.c使用gcc 4.7.3将其编译为汇编器,得到了以下汇编器:

    .file   "test.c"
    .text
    .globl  compare
    .type   compare, @function
compare:
.LFB24:
    .cfi_startproc
    xorl    %edx, %edx
.L2:
    movsbl  (%rdi,%rdx), %eax
    movsbl  (%rsi,%rdx), %ecx
    incq    %rdx
    cmpb    %cl, %al
    jne .L4
    testb   %al, %al
    jne .L2
.L4:
    subl    %ecx, %eax
    ret
    .cfi_endproc
.LFE24:
    .size   compare, .-compare
    .section    .rodata.str1.1,"aMS",@progbits,1
.LC0:
    .string "bar"
.LC1:
    .string "foo"
    .section    .text.startup,"ax",@progbits
    .globl  main
    .type   main, @function
main:
.LFB25:
    .cfi_startproc
    movl    $.LC0, %esi
    movl    $.LC1, %edi
    call    compare
    movl    $1, %eax
    ret
    .cfi_endproc
.LFE25:
    .size   main, .-main
    .ident  "GCC: (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3"
    .section    .note.GNU-stack,"",@progbits

我在x86汇编器中不是很好,但据我所知,对strcmp的调用已删除,而仅由常量表达式(movl $1, %eax代替因此,如果您在测试中使用常量表达式,则gcc可能会将strcmp优化为常量。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么strcmp比我的函数快得多?

来自分类Dev

为什么<比!=快得多?

来自分类常见问题

numpy如何比我的Fortran例程快得多?

来自分类Dev

下载速度比我的连接速度快得多

来自分类Dev

为什么StringBuilder比String快得多

来自分类常见问题

为什么字典比列表快得多?

来自分类Dev

为什么PreparedStatement比Statement快得多?

来自分类Dev

为什么熊猫.isin比“ in”快得多?

来自分类Dev

为什么用余弦函数计算比用Secant Trig函数计算快得多?

来自分类Dev

为什么C ++ Lambda函数作为比较函数比等效对象快得多

来自分类Dev

为什么性能测试向我显示列表比使用我的代码的数组快得多?

来自分类Dev

MATLAB函数第一次变慢,但随后变快得多。为什么?

来自分类Dev

为什么我的DSL连接这么慢,而邻居的速度却快得多?

来自分类Dev

Android:为什么本机代码比Java代码快得多

来自分类Dev

为什么EnumerateFiles比计算大小要快得多

来自分类Dev

为什么memcmp比for循环检查要快得多?

来自分类Dev

Python清单:为什么.sort()比sorted()快得多?

来自分类Dev

为什么批处理模式比parfor快得多?

来自分类Dev

为什么ifstream :: read比使用迭代器快得多?

来自分类Dev

为什么在预热阶段浮点运算要快得多?

来自分类Dev

为什么数组的直接索引比迭代快得多?

来自分类Dev

为什么Python中的这段代码比C ++快得多?

来自分类Dev

为什么SSH感觉比HTTP快得多?

来自分类Dev

为什么memcmp比for循环检查要快得多?

来自分类Dev

为什么在预热阶段浮点运算要快得多?

来自分类Dev

为什么子图比图快得多?

来自分类Dev

为什么wget比通过Chrome下载要快得多?

来自分类Dev

为什么认为异步代码比同步代码快得多?

来自分类Dev

为什么fio seq_writes比dd快得多?

Related 相关文章

  1. 1

    为什么strcmp比我的函数快得多?

  2. 2

    为什么<比!=快得多?

  3. 3

    numpy如何比我的Fortran例程快得多?

  4. 4

    下载速度比我的连接速度快得多

  5. 5

    为什么StringBuilder比String快得多

  6. 6

    为什么字典比列表快得多?

  7. 7

    为什么PreparedStatement比Statement快得多?

  8. 8

    为什么熊猫.isin比“ in”快得多?

  9. 9

    为什么用余弦函数计算比用Secant Trig函数计算快得多?

  10. 10

    为什么C ++ Lambda函数作为比较函数比等效对象快得多

  11. 11

    为什么性能测试向我显示列表比使用我的代码的数组快得多?

  12. 12

    MATLAB函数第一次变慢,但随后变快得多。为什么?

  13. 13

    为什么我的DSL连接这么慢,而邻居的速度却快得多?

  14. 14

    Android:为什么本机代码比Java代码快得多

  15. 15

    为什么EnumerateFiles比计算大小要快得多

  16. 16

    为什么memcmp比for循环检查要快得多?

  17. 17

    Python清单:为什么.sort()比sorted()快得多?

  18. 18

    为什么批处理模式比parfor快得多?

  19. 19

    为什么ifstream :: read比使用迭代器快得多?

  20. 20

    为什么在预热阶段浮点运算要快得多?

  21. 21

    为什么数组的直接索引比迭代快得多?

  22. 22

    为什么Python中的这段代码比C ++快得多?

  23. 23

    为什么SSH感觉比HTTP快得多?

  24. 24

    为什么memcmp比for循环检查要快得多?

  25. 25

    为什么在预热阶段浮点运算要快得多?

  26. 26

    为什么子图比图快得多?

  27. 27

    为什么wget比通过Chrome下载要快得多?

  28. 28

    为什么认为异步代码比同步代码快得多?

  29. 29

    为什么fio seq_writes比dd快得多?

热门标签

归档