Можно ли как-нибудь ускорить выполнение функции проверки равенства строк?
Чем быстрее, тем лучше, но нет, если он ломается функционально. Остальной код может как будет
// Faster but wrong functionally
int stringsequal0(register char *s1, register char *s2) {
return 0;
}
Оба из OP strcequal()
функционально несовершенны. Первые сообщают strequal("", any_string)
как равные, а вторые сообщают как равные каждый раз, когда char
s добавляют к 0. (Рассмотрим char
в одной строке с отрицательным значением).
Быстрее: Да. Вместо того, чтобы вызывать свой собственный для strequal()
, либо вызовите стандартную библиотечную функцию strcmp()
, либо посмотрите код модели после одной из ее реализаций.
Концептуально, в цикле необходимо только сравнение *s1 == *s2
и *s1 == 0
. *s2 == 0
- это , а не , необходимое в цикле.
inline /* or don't inline */ int strequal1(const char *a, const char *b) {
return strcmp(a,b)==0;
}
int strequal2(const char *s1, const char *s2) {
while (*s1 && *s1 == *s2) {
s1++;
s2++;
}
return *s1 == *s2;
}
В конце концов, только профилирование будет определять, что "быстрее". Напомним, один подход может быть быстрее с небольшими и маловероятными математическими строками, в то время как другой подход может работать лучше с длинными строками, которые редко отличаются.
Компиляторы умны и хитры. Оптимизирующие компиляторы могут анализировать код и заменять вызовы, такие как strcmp(s, "abc")==0
, для сравнения с 4 байтами. Обратите внимание, что компиляторы могут «обманывать» и выполнять действия, на которые не может положиться обычный код C. Компилятор может не понимать ваш strequal()
, чтобы воспользоваться аналогичными преимуществами.
Я сомневаюсь очень OP может вывести решение, которое значительно превосходит strcmp()
с длинными похожими строками.