Какой самый лучший или самый быстрый способ сравнить две строки? - PullRequest
5 голосов
/ 25 февраля 2012

Я не уверен, насколько быстрым является приведенный ниже код. Если кто-нибудь знает более быстрый / оптимизированный код, чем этот, пожалуйста, дайте мне знать.

int xstrcmp(char *s1, char *s2)
{
  while (*s1 == *s2++)
            if (*s1++ == 0)
                    return (0);
  return (*(const unsigned char *)s1 - *(const unsigned char *)(s2-1));
}

Ответы [ 3 ]

16 голосов
/ 25 февраля 2012

Используйте ::strcmp вместо собственной версии, выпущенной вручную. Ваш поставщик компилятора, скорее всего, имеет версию только для сборки, в которой для сравнения используются специфичные для процессора функции (например, в SSE4.2 имеются специальные инструкции для быстрого сравнения строк.) Версия MSVC написана, например, в сборке и использует большие сравнения (целые слова). вместо отдельных символов) в максимально возможной степени в специальном регистре выровненные начало / конец строки (если у вас установлен VS2010, он находится в VC/crt/src/intel/strcmp.asm.)

5 голосов
/ 25 февраля 2012

Вы измерили, насколько это быстрее, чем strcmp? C strcmp уже должен быть хорошо оптимизирован.

Некоторые другие методы, которые вы могли бы использовать:

  • Используйте memcmp, если вы уже знаете длину строк.
  • Сравните 4 или 8 символов за раз, интерпретируя строки как массивы int32 или int64, и обрабатывая оставшиеся символы как символы.
    • У вас могут быть проблемы, если ваши указатели указывают на не 4-байтовую или 8-байтовую выровненную память, поэтому сравнивайте как символы, пока не достигнете выравнивания
3 голосов
/ 25 февраля 2012

Если я проверяю на равенство, иногда я пишу это:

if (a[0]==b[0] && strcmp(a, b)==0){.....

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

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