• XSS.stack #1 – первый литературный журнал от юзеров форума

Замеряем производительность функций сравнения

MegadethProj

RAID-массив
Пользователь
Регистрация
04.10.2019
Сообщения
84
Реакции
12
Всем привет, это моя первая статья, написат её меня побудило то, что когда я писал 1 софт из-за того что я использовал плохую
функцию сравнения строк он работал очень долго, сейчас я хочу замерить скорось работы таких функций как: lstrcmpW, wcsicmp , StrStrW
и понять какая из них более приспособленна к частым вызовам.

Тестирование будем проводить на таком коде:
C++:
int main(int argc, char *argv[]) {
    WCHAR* p1 = (WCHAR*)L"abcdabcdabcdabcd";
    WCHAR* p2 = (WCHAR*)L"abcdabcdabcdabcd";

    long double before = GetTickCount();
    for (int i = 0; i < 10000000; i++) {
        /*compare*/(p1, p2);
    }
    long double after = GetTickCount();
    long double seconds = (after - before) / 1000;
    printf("\n\n\nSeconds: %lf", seconds);

    getchar();
    return -1;
}

1. lstrcmpW
Первый опыт: 8.969000 сек
Второй опыт: 7.407000 сек
Третий опыт: 7.656000 сек

2. wcsicmp
Первый опыт: 0.844000 сек
Второй опыт: 0.891000 сек
Третий опыт: 0.875000 сек

2. StrStrW
Первый опыт: 9.141000 сек
Второй опыт: 7.859000 сек
Третий опыт: 7.797000 сек

Как можно понять из результатов выше, самая быстрая функция это wcsicmp, ну и бонусом я напишу свою функцию для сравнения и посмотрим на её
скорость.

C++:
int wcmp(wchar_t* p1, wchar_t* p2) {
    
if (p1 && p2) {
        do {
            if (*p1 != *p2) return 1;
            p1++; p2++;
        } while (*p1 && *p2);
        if (*p1 == L'\0' && *p2 == L'\0') return 0;
    }

    return 1;
}

При запуске показывает 0.453000 секунд :smile23:
 
Последнее редактирование:
As I see how it done
mov ebx, -2
.cule:
add ebx, 2
mov ax, [esi+ebx]
cmp ax, [edi+ebx]
jne .stop
or ax, ax
jnz .cucle:
.stop
...

but yours logic looks like

.cule:
mov ax, [esi]
cmp ax, [edi]
jne .stop
add esi, 2 !double adding
add edi, 2 !double adding
or ax, ax
jnz .cucle:
.stop
...
but this is not problem =)
real problem is
p1++; p2++;
and next check for zero
} while (*p1 && *p2);

how about
wcmp(L"", L""); ?

here it the same
if (*p1 != *p2) return 1;
here it up
p1++; p2++;
here is ups :smile11:
} while (*p1 && *p2);
 
Пожалуйста, обратите внимание, что пользователь заблокирован
As I see how it done


but yours logic looks like

but this is not problem =)

how about
here it the same
here is ups :smile11:
why did you start writing on english?what the point to do ths on forum where 99% ppl is russian speaking
 
As I see how it done
mov ebx, -2
.cule:
add ebx, 2
mov ax, [esi+ebx]
cmp ax, [edi+ebx]
jne .stop
or ax, ax
jnz .cucle:
.stop
...

but yours logic looks like

.cule:
mov ax, [esi]
cmp ax, [edi]
jne .stop
add esi, 2 !double adding
add edi, 2 !double adding
or ax, ax
jnz .cucle:
.stop
...
but this is not problem =)
real problem is
p1++; p2++;
and next check for zero
} while (*p1 && *p2);

how about
wcmp(L"", L""); ?

here it the same
if (*p1 != *p2) return 1;
here it up
p1++; p2++;
here is ups :smile11:
} while (*p1 && *p2);
can you post here fixed solution?
 
I sure you can fix it by your self, and make nice optimization.. may be use tricks like
register wchar_t* pStr1=p1;
register wchar_t* pStr2=p2;
register int offset =-2;
....
;)
 
fixed solution of someone need it:

C++:
int wchrcmp(const wchar_t* p1, const wchar_t* p2) {
    const wchar_t* str1 = p1;
    const wchar_t* str2 = p2;
    int offset = 0;

    if (str1 && str2) {
        do {
            if (str1[offset] != str2[offset]) return 1;
            offset++;
        } while (str1[offset - 1] && str2[offset - 1]);
        if (str1[offset - 1] == L'\0' && str2[offset - 1] == L'\0') return 0;
    } return 1;
}
 
fixed solution of someone need it:

C++:
int wchrcmp(const wchar_t* p1, const wchar_t* p2) {
    const wchar_t* str1 = p1;
    const wchar_t* str2 = p2;
    int offset = 0;

    if (str1 && str2) {
        do {
            if (str1[offset] != str2[offset]) return 1;
            offset++;
        } while (str1[offset - 1] && str2[offset - 1]);
        if (str1[offset - 1] == L'\0' && str2[offset - 1] == L'\0') return 0;
    } return 1;
}
they looks ugly. we are believe on you, make it better.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх