Не существует эффективного способа сравнения двухсимвольных строк.
Есть несколько способов улучшить базовый stricmp()
, если он очень высок в профиле (что я видел в реальных приложениях). Вы можете обнаружить, что основная часть стоимости находится в tolower()
, что является функцией, вызываемой для каждого символа, чтобы преобразовать его из верхнего в нижний регистр перед сравнением. Затраты на этот вызов функции, а также стоимость ее тела могут составить значительное время, потому что оно должно быть чувствительным к локали и иметь дело с буквами типа Ö. Если вы знаете, что ваши сравнения будут когда-либо выполняться только в одной локали (т.е. только на английском языке), то вы можете ускорить tolower (), создав 256-символьную таблицу поиска ASCII и внедрив stricmp () вручную.
В GCC, если вы знаете, что нацелены на ЦП, поддерживающий SSE3, вы также можете указать ключ командной строки -msse3
, который генерирует несколько более эффективные машинные инструкции для сравнения строк. Это, в основном, помогает при сравнении чувствительных , однако.
В моей работе любой алгоритм, который требует сравнения большого количества константных символьных строк, в отличие от использования интернов или символов для представления таких идентификаторов, считается запахом кода. В одном проекте профилирование показало, что около 7% процессорного времени было потрачено внутри tolower () внутри stricmp
. Это фактически 7 из 100 машин на центр обработки данных, которые делают только превращение прописных букв в строчные.