Подтвердить что ты не робот

Является ли оператор неравенства быстрее, чем оператор равенства?

Я знаю, что это микро-оптимизация, поэтому я прошу из чистого любопытства.

Логически, микропроцессор не должен сравнивать все биты обоих операндов оператора равенства, чтобы определить результат "FALSE".

Примечание. Это связано с программированием, поскольку оно влияет на скорость выполнения программы.

4b9b3361

Ответ 1

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

Ответ 2

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

Например, на X86 вы можете увидеть это, посмотрев, как работает сборка. Ознакомьтесь с операциями потоковой сборки сборки X86 - выполняете ли вы равенство или неравенство, это делается как 2 операции.

Сначала вы выполняете операцию CMP (сравнение). Затем вы выполняете проверку, чтобы убедиться, что сравнение равно, не равно и т.д. Это просто проверка результатов сравнения - в обоих случаях вы выполняете 2 операции.

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

Ответ 3

Похоже, вы должны прочитать Справочное руководство по оптимизации архитектуры Intel 64 и IA-32.

Посмотрите на "Задержка трубопровода" и "Задержка трубопровода" в инструкциях, которые вы используете. Достаточно сказать, что все, что вы делаете с ints, занимает около 1 такта, чтобы выполнить (4 миллиарда из них в секунду). Чтение данных из памяти может занять 100-1000 в зависимости от того, сколько данных вы работаете. Гораздо важнее.

Ответ 4

Сравнение обычно выполняется как вычитание, которое игнорирует результат. Сумматор в ЦП будет работать со всеми битами одновременно, так что это операция с постоянным временем.

Равенство тогда просто определяет, является ли вывод 0. На x86 существуют флаги, которые устанавливаются в результате сравнения, а ветвь выполняется через jz или jnz (скачок, если ноль, скачок, если не ноль). Так что нет, не было бы реальной разницы в скорости.

Другие платформы (такие как ARM и IA64) ведут себя аналогичным образом.

Ответ 5

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

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

Ответ 6

Операция сравнения происходит на восходящем (или, возможно, падающем) фронте микропроцессорного тактового сигнала. Затем следующая операция выполняется в следующем такте. Таким образом, с точки зрения скорости выполнения, равенство и неравенство занимают одинаковое количество времени для почти каждого процессора на рынке сегодня.

Я говорю почти потому, что помню, как я читал о некоторых процессорах, которые, как предполагалось, не были основаны на часах, а работали на основе времени, поэтому, если бы сравнение op было быстрее, чем добавление op, тогда набор из n сравнений меньше времени, чем n добавляет. Но я на 99% уверен, что это был какой-то исследовательский проект, а не коммерческий продукт:)

Ответ 7

Есть несколько незначительных случаев, когда это может иметь некоторый эффект.

В ARM-процессорах (для архитектуры набора инструкций с 32-разрядной/не-большой информацией (ISA)) все команды являются условными. Иногда вы можете уйти с внутренним контуром, имеющим одну ветвь (от конца до начала), несмотря на множество условий. В нескольких случаях, имеющих логическое сравнение (TEQ), нарушается несколько флагов (влияет на отрицательные (N) и ноль (Z), но не переносится (C) или переполнение (V)), позволяет волосатому коду избежать команды перехода (неиспользованный).

И наоборот, IIRC (я на самом деле не запрограммировал его, но посмотрел на результат компилятора C более десяти лет назад). 68000 имеет буквальную инструкцию EOR/XOR только для регистра D4. Таким образом, арифметическое сравнение, вероятно, было бы лучше (хотя вы все равно могли игнорировать посторонние флаги - дело в том, что набор команд немного нерегулярный).

Как упоминалось предыдущим плакатом, большая часть действия выше с задержкой памяти, диска, сети и веб-сервиса.

Ответ 8

Если вы хотите поднять это на более общий вопрос, вам нужно будет рассмотреть разумное распределение ответов TRUE и FALSE, и вам придется рассматривать произвольную длину слова, включая дольше, чем регистр.

В алгоритмах поиска (и сортировка может рассматриваться как расширение поиска), более распространено использование таких операторов, как "<" или "< =", чем "==". Это связано с тем, что распределение результатов от оператора "==" имеет тенденцию сильно искажаться в сторону "ложных" и, следовательно, имеет низкую энтропию (т.е. Низкую информационную доходность) за выполнение. Это означает, что они должны выполняться больше раз, чтобы получить одну и ту же информацию - проверить линейный поиск.

В любом случае они берут O (длина слова) числа бит-сравнений, хотя, если длина слова равна <= длина регистра, сравнения проводятся параллельно, возможно, с небольшой задержкой для переноса. (На самом деле, как я думаю об этом, в типичном неравном случае либо сравнение может остановиться на первом неравном бите, и если вероятность равенства достаточно мала, это может произойти довольно рано.)

Ответ 9

Время, затрачиваемое на подобное сравнение, обычно представляет собой один такт.

32-разрядный процессор будет выполнять все 32 бита одновременно; 64-разрядный будет делать 64 бит одновременно.

Если в конвейере есть задержка или срыв, это будет потому, что операнд недоступен и должен быть извлечен. Вот где самые большие накладные расходы. Но это было бы сделано в куске, соответствующем архитектуре процессора, поэтому он все равно был бы взят как 32- или 64-битный блок.

Ответ 10

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

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

Кроме того, что касается людей, занимающихся сборочными операциями, единственная разница между CMP и SUB заключается в том, какие флаги установлены. Они обычно выполняются с теми же частями машины, поскольку CMP должен возвращать флаги, которые представляют равенство, меньше и больше.