Наиболее эффективное сравнение константных символов * без учета регистра - PullRequest
3 голосов
/ 27 марта 2012

Может, кто-нибудь подскажет наиболее эффективный способ сравнения двух константных звезд?

#include <iostream>
#include <string>

int main()
{
    const char* value1 = "hello";
    const char* value2 = "HELLO";
    const char* possibility = NULL;


    if(stricmp(value1, value2)==0)
    {
        std::cout <<"\nThey Match!!!!!" << std::endl;
    }
    else{std::cout << "\nThey dont match :("<< std::endl;}

    return 0;
}

Я использовал следующую стандартную функцию, но знаю, что это не самый эффективный способ сделать это?

Кроме того, stricmp не может обработать NULL, что в моем случае может произойти.

Так есть ли другие альтернативы, хорошие для производительности?

Заранее спасибо

Ответы [ 2 ]

7 голосов
/ 27 марта 2012

Не существует эффективного способа сравнения двухсимвольных строк.

Есть несколько способов улучшить базовый stricmp(), если он очень высок в профиле (что я видел в реальных приложениях). Вы можете обнаружить, что основная часть стоимости находится в tolower(), что является функцией, вызываемой для каждого символа, чтобы преобразовать его из верхнего в нижний регистр перед сравнением. Затраты на этот вызов функции, а также стоимость ее тела могут составить значительное время, потому что оно должно быть чувствительным к локали и иметь дело с буквами типа Ö. Если вы знаете, что ваши сравнения будут когда-либо выполняться только в одной локали (т.е. только на английском языке), то вы можете ускорить tolower (), создав 256-символьную таблицу поиска ASCII и внедрив stricmp () вручную.

В GCC, если вы знаете, что нацелены на ЦП, поддерживающий SSE3, вы также можете указать ключ командной строки -msse3, который генерирует несколько более эффективные машинные инструкции для сравнения строк. Это, в основном, помогает при сравнении чувствительных , однако.

В моей работе любой алгоритм, который требует сравнения большого количества константных символьных строк, в отличие от использования интернов или символов для представления таких идентификаторов, считается запахом кода. В одном проекте профилирование показало, что около 7% процессорного времени было потрачено внутри tolower () внутри stricmp. Это фактически 7 из 100 машин на центр обработки данных, которые делают только превращение прописных букв в строчные.

3 голосов
/ 27 марта 2012

stricmp, вероятно, быстрее, чем все, что вы можете написать самостоятельно, и вам не стоит беспокоиться, если вы не знаете, что это будет узким местом в производительности вашей программы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...