2013-04-05 3 views
2

Я выполняю несколько тестов моего кода, и я решил использовать производительность strstr в качестве контрольной точки. На моем ПК производительность сканирования всего текста файла ~ 7mb (предварительно загруженного в ОЗУ) составляет около 10 Гбит/с.
Странно, что когда я скопировал код функции strstr из «C: \ Program Files (x86) \ Microsoft Visual Studio 11.0 \ VC \ crt \ src \ strstr.c» в мою программу, он выполнил много хуже - около 650 Мбит/с. Код был таким:коэффициенты производительности strstr

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 теста - strstr и скопирован на strstr2).

+0

Сколько раз вы просматривали файл? –

+0

Бенчмаркинг сложный, хотя это не должно быть *, что трудно ... Тем не менее, вы должны включить более подробную информацию о том, как вы это протестировали. Весьма странный код. Вы можете сравнить его с кодом GNU libc [здесь] (http://sourceware.org/git/?p=glibc.git;a=blob;f=string/strstr.c;h=b2f8e74caeba5a4e7d2a4bad3daf5e0a6189d2c6;hb=HEAD) но это немного больше ... участие. – unwind

ответ

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 
+0

FYI - это тот же код, что и в VS2012. Хороший ответ. –

Смежные вопросы