целочисленное и строковое сравнение на системном уровне - PullRequest
8 голосов
/ 19 июля 2011

Как сравниваются целые числа и строки на низком уровне?Как всякий раз, когда мы используем

int a = 11;
int b = 12;

compare(a,b); //Just an example comparison, not in any particular language.

И

String a = "11";
String b = "12";

compare(a,b);

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

И почему целочисленные сравнения всегда считаются быстрее тогда сравнения строк?

Ответы [ 2 ]

12 голосов
/ 19 июля 2011

Как правило, строка или целое число (в простейшем виде) сравнивается побайтно.

Таким образом, для примера 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 длины (пустые), поскольку они могут просто сравнивать длину (которая может быть целым числом).

2 голосов
/ 19 июля 2011

целые числа хранятся как целочисленные значения, представленные в двоичном виде в виде одного набора из 1 и нулей, занимающих пару байтов (в зависимости от ОС)

строки хранятся как один символ на цифру, каждаяодин использует битовый паттерн в своем байте.

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

...