C strstr性能的概率

C strstr性能的概率,c,performance,algorithm,visual-c++,C,Performance,Algorithm,Visual C++,我正在执行代码的一些基准测试,我决定使用strstr性能作为参考点。在我的电脑上,扫描预加载到RAM中的~7mb文件的所有文本的性能约为10Gb/秒。 奇怪的是,当我将strstr函数的代码从C:\Program Files x86\Microsoft Visual Studio 11.0\VC\crt\src\strstr.C复制到我的程序中时,它的性能要差得多——大约650 Mb/秒。代码是这样的: char * __cdecl strstr2 ( char * str1,

我正在执行代码的一些基准测试,我决定使用strstr性能作为参考点。在我的电脑上,扫描预加载到RAM中的~7mb文件的所有文本的性能约为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);

}
编译发行版中的所有代码,默认情况下所有编译器选项,在没有调试器的情况下运行。 这种差异是由于某些编译器选项造成的,还是因为strstrstr中的代码不是编译后的CRT中使用的实际代码,还是其他原因


UPD我正在使用QueryPerformanceCounter来测量计时。每次测试重复500次,之后我计算平均速度并开始下一次测试。目前,我正在比较两个测试—CRT的strstr和复制的strstr2。Microsoft CRT可能使用VC\CRT\src\intel\strstr.asm中的strstr汇编程序版本。在我的系统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

Microsoft CRT可能使用VC\CRT\src\intel\strstr.asm中的strstrstr汇编程序版本。在我的系统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

您扫描了文件多少次?基准测试很难,尽管它不应该那么难。。。不过,您应该包括一些关于如何测试此功能的更多细节。代码也很奇怪。您可以将它与GNULIBC代码进行比较,但它比GNULIBC代码更。。。涉及。您扫描了文件多少次?基准测试很难,虽然它不应该那么难。。。不过,您应该包括一些关于如何测试此功能的更多细节。代码也很奇怪。您可以将它与GNULIBC代码进行比较,但它比GNULIBC代码更。。。卷入的