Как правило, строка или целое число (в простейшем виде) сравнивается побайтно.
Таким образом, для примера int это становится единственной инструкцией ЦП:
cmp a, b
, которая выполняется довольно быстро (при условии 32-битного целого, 32-битного или лучшего процессора)Это одно сравнение, которое вписывается в регистры процессора.
Строки, однако, являются более сложными.В простейшем случае это выглядит так:
foreach ( character c in string a, character d in string b )
cmp c, d
и должно проходить по всей строке, символ за символом.Если строки имеют разную длину, это должно обрабатывать это (очевидно, что оба целых имеют одинаковый размер).
На более сложном уровне, с локалью и различными наборами символов, каждый символ строки может быть 2-4 байта и некоторые символы (с акцентами и тому подобное) могут сравниваться как равные друг другу, несмотря на наличие разных значений байтов.Требуется гораздо больше обработки и обработки, а большая часть работы почти всегда означает более медленную работу.
Точное поведение зависит от локали, набора символов и языка.Некоторые языки (например, C #) хранят строки с длиной, в то время как другие (C) просто хранят массив символов.Другие языки могут быть разработаны для обработки строк или иметь оптимизированные библиотеки для их обработки, что может снизить стоимость.
Интересно, что теоретически при работе со строками ASCII сравнение строк из 3 символов или менее может быть примерно равнобыстрый, как сравнение целых.В этом случае это больше связано с количеством задействованной памяти (strcmp
для ASCII может использовать memcmp
внутри, что примерно равно тому, что ==
будет использовать в любом случае).Это также может быть справедливо для языков, которые хранят длину строки в начале и строки 0 длины (пустые), поскольку они могут просто сравнивать длину (которая может быть целым числом).