Почему целочисленное сравнение быстрее сравнения строк? - PullRequest
11 голосов
/ 05 февраля 2011

Я нашел комментарии о том, как избегать строк для сравнения значений (особенно в циклах) в нескольких книгах, потому что сравнение строк намного медленнее (используя std :: string). Но почему именно это?

Это потому, что целочисленные единицы в процессоре работают быстрее?

Полагаю, что строки должны быть в байтах, поэтому не будет ли сравнение байтов работать одинаково?

Спасибо!

Ответы [ 5 ]

23 голосов
/ 05 февраля 2011

С целым числом существуют инструкции на уровне машины, которые могут выполнять сравнение за один цикл.

Строка, однако, состоит из множества символов. Чтобы сравнить строки, вам, в худшем случае, нужно посмотреть на каждый символ строки.

Фактически, когда вы сравниваете строки, вы, скорее всего, используете целочисленное сравнение для каждого символа в строке. Вы, вероятно, можете увидеть, как это быстро может превратиться во множество сравнений по сравнению со сравнением двух целых чисел.

Пример: если вы хотите сравнить 1073741822 с 1073741823.

  • Сравнение строк : Вы должны сравнить каждую из цифр одну за другой. Это 10 сравнений, поскольку целые числа отличаются только последней цифрой.
  • Целочисленное сравнение : Вы можете сделать это в одном сравнении, сохранив 9 сравнений по сравнению со сравнением String.

Естественно, это немного упрощено, но, надеюсь, все понятно.

12 голосов
/ 05 февраля 2011

Проблема в том, что сравнение строк - это не просто сравнение, а целая последовательность из них в цикле.Что вы ожидаете, если вы сравните две строки, каждая из которых имеет длину 10001 символ и первые 9000 одинаковы?

Кстати, SSE позволяет сравнивать строки LOT быстрее, чем по одному символу за раз,но он никогда не сможет достичь скорости сравнения целых чисел.

1 голос
/ 05 февраля 2011

Целые числа обычно 4 -байт.

Строки находятся между 1 и бесконечность * байтов.

* Эй, вы понимаете, о чем я, не так ли?

1 голос
/ 05 февраля 2011

Смутно говоря, для сравнения строк требуется n целых чисел, где n - размер строки, тогда как целочисленное сравнение - это только одно сравнение, если вы думаете, что это соотношение. Это грубое представление о том, что может происходить при сравнении строк!

Очевидно, что сравнение строк будет более медленным процессом, так как это число n целочисленных сравнений (приблизительно) .

0 голосов
/ 05 февраля 2011

Компилятор может оптимизировать целочисленные сравнения для непосредственного выполнения внутри регистров процессора.

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