Оператор неравенства быстрее, чем оператор равенства?

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

Суммируя все предложения метода замены @aurbano, @AL the X, @Jesse и @ Dominic108, можно выглядеть следующим образом

function get_error_handler(){
    $handler = set_error_handler(function(){});
    restore_error_handler();
    return $handler;
}
54
задан Mackenzie 8 July 2014 в 19:32
поделиться

10 ответов

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

48
ответ дан 7 November 2019 в 07:54
поделиться

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

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

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

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

29
ответ дан 7 November 2019 в 07:54
поделиться

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

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

12
ответ дан 7 November 2019 в 07:54
поделиться

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

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

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

11
ответ дан 7 November 2019 в 07:54
поделиться

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

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

3
ответ дан 7 November 2019 в 07:54
поделиться

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

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

2
ответ дан 7 November 2019 в 07:54
поделиться

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

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

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

2
ответ дан 7 November 2019 в 07:54
поделиться

Обычно для такого сравнения требуется один такт.

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

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

1
ответ дан 7 November 2019 в 07:54
поделиться

Если вы хотите поднять этот вопрос до более общего, вам придется рассмотреть разумное распределение ИСТИННЫХ и ЛОЖНЫХ ответов, и вам придется учитывать произвольную длину слова, в том числе длиннее, чем регистр.

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

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

2
ответ дан 7 November 2019 в 07:54
поделиться

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

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

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

1
ответ дан 7 November 2019 в 07:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: