strstr表现的几率

时间:2013-04-05 10:01:10

标签: c performance algorithm visual-c++

我正在执行代码的一些基准测试,并且我决定使用strstr性能作为参考点。在我的PC上扫描~7mb文件(预装入RAM)的所有文本的性能大约是10Gb /秒 奇怪的是,当我将strstr函数的代码从“C:\ Program Files(x86)\ Microsoft Visual Studio 11.0 \ VC \ crt \ src \ strstr.c”复制到我的程序时,它执行了很多更糟 - 大约650 Mb /秒。代码是这样的:

char * __cdecl strstr2 (
    char * str1,
    const char * str2
    )
{
    char *cp = (char *) str1;
    char *s1, *s2;

    if ( !*str2 )
        return((char *)str1);

    while (*cp)
    {
        s1 = cp;
        s2 = (char *) str2;

        while ( *s1 && *s2 && !(*s1-*s2) )
            s1++, s2++;

        if (!*s2)
            return(cp);

        cp++;
    }

    return(NULL);

}

编译Release中的所有代码,所有编译器选项都是默认的,在没有调试器的情况下运行 这是因为某些编译器选项的不同,还是strstr.c中的代码不是编译CRT中使用的真实代码,还是其他什么?

UPD我正在使用QueryPerformanceCounter来衡量时间。每次测试重复500次,之后我计算平均速度并开始下一次测试。 (目前我正在比较2个测试 - CRT的strstr和复制的strstr2)

1 个答案:

答案 0 :(得分:4)

Microsoft CRT可能使用strstr中的VC\crt\src\intel\strstr.asm汇编程序版本。在我的系统(Visual Studio 10.0)上,内部循环如下所示:

loop_start:
        mov     al,[esi]            ; put next char from str1 into al
        add     esi,1               ; increment pointer in str1
in_loop:
        cmp     al,dl
        je      first_char_found

        test    al,al               ; end of str1?
        jnz     loop_start          ; no, go get another char from str1