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