Да, есть способ узнать обработчик ошибок, не устанавливая новый. Это не одна нативная функция php. но его эффекты именно то, что вам нужно.
Суммируя все предложения метода замены @aurbano, @AL the X, @Jesse и @ Dominic108, можно выглядеть следующим образом
function get_error_handler(){
$handler = set_error_handler(function(){});
restore_error_handler();
return $handler;
}
Обычно микропроцессор выполняет сравнение, используя электрические вентили, а не шаг за шагом, как это. Проверяет сразу все биты.
Это зависит от вашей платформы, но в целом он будет работать идентично.
Например, на X86 вы можете увидеть это, посмотрев, как работает сборка. Ознакомьтесь с операциями потока управления сборкой X86 - выполняете ли вы равенство или неравенство, это выполняется как 2 операции.
Сначала вы выполняете операцию CMP (сравнение). Затем вы проверяете, является ли сравнение равным, не равным и т. Д. Это просто проверка результатов сравнения - в обоих случаях вы выполняете 2 операции.
Однако во многих языках программирования более высокого уровня , дела обстоят иначе. Многие языки определяют неравенство с точки зрения равенства - чтобы проверить неравенство, вы выполняете проверку равенства, а затем вторую проверку, чтобы убедиться, что оно ложно. Это заставляет равенство быть (микроскопически) быстрее на этих языках.
Похоже, вам следует прочитать Справочное руководство по оптимизации архитектур Intel 64 и IA-32 .
Найдите там «Задержку конвейера» и «Задержку конвейера» в используемых инструкциях. Достаточно сказать, что все, что вы делаете с ints, занимает около 1 такта для выполнения (4 миллиарда из них в секунду). Чтение данных из памяти может занять 100-1000 в зависимости от того, с каким объемом данных вы работаете. Гораздо важнее.
Сравнение обычно выполняется как вычитание без учета результата. Сумматор в ЦП будет работать со всеми битами одновременно, так что это операция с постоянным временем.
Тогда равенство просто определяет, равен ли выход 0. На x86 есть флаги, которые устанавливаются в результате сравнения и перехода. выполняется через jz или jnz (переход, если ноль, переход, если не ноль). Так что нет, реальной разницы в скорости не будет.
Другие платформы (такие как ARM и IA64) ведут себя аналогичным образом.
Сами инструкции будут выполняться с той же скоростью, что и в других ответах.
Вы можете столкнуться с различиями в предсказании ветвлений или эффектах кеширования. Это будет варьироваться от процессора к процессору и от компилятора к компилятору, поэтому делать обобщения невозможно. Если вы находитесь на том уровне, где это может иметь значение, единственный способ узнать это - попробовать и измерить.
Операция сравнения происходит по нарастающему (или, возможно, спадающему) фронту тактового сигнала микропроцессора. Затем следующая операция происходит в следующем тактовом цикле. Таким образом, с точки зрения скорости выполнения, равенство и неравенство занимают одинаковое количество времени почти для всех процессоров, представленных сегодня на рынке.
Я говорю почти , потому что я помню, как читал о некоторых процессорах, которые должны были не работать. на основе часов, но на основе времени работы, поэтому, если операция сравнения действительно была быстрее, чем операция сложения, то набор из n сравнений займет меньше времени, чем добавляет n . Но я примерно на 99% уверен, что это был просто исследовательский проект, а не коммерческий продукт :)
Есть несколько незначительных случаев, когда это может иметь некоторый эффект.
На процессорах ARM (для 32-битной архитектуры набора команд без большого пальца (ISA)) все инструкции условный. Иногда вы можете обойтись внутренним циклом, имеющим одну ветвь (от конца до начала), несмотря на несколько условий. В некоторых случаях при логическом сравнении ( TEQ
) нарушается несколько флагов (влияет на отрицательный (N) и ноль (Z), но не на перенос (C) или переполнение (V)), позволяя волосатому коду быть избегайте инструкции ветвления (невыполненной).
И наоборот, IIRC (я никогда не программировал ее, но смотрел на вывод компилятора C более десяти лет назад) 68000 имеет буквальную инструкцию EOR / XOR только для регистра D4 .
Обычно для такого сравнения требуется один такт.
32-битный процессор обрабатывает все 32 бита одновременно; 64-битный будет обрабатывать 64 бита сразу.
Если есть задержка или остановка в конвейере, это будет из-за того, что операнд недоступен и его нужно получить. Это , где наблюдаются наибольшие накладные расходы. Но это было бы сделано в блоке, соответствующем архитектуре процессора, поэтому он все равно был бы задействован как 32- или 64-битный блок.
Если вы хотите поднять этот вопрос до более общего, вам придется рассмотреть разумное распределение ИСТИННЫХ и ЛОЖНЫХ ответов, и вам придется учитывать произвольную длину слова, в том числе длиннее, чем регистр.
В алгоритмах поиска (а сортировку можно рассматривать как расширение поиска) чаще используются такие операторы, как «<» или «<=», чем «==». Это связано с тем, что распределение результатов от оператора «==» имеет тенденцию сильно искажаться в сторону «ложь» и, следовательно, они имеют низкую энтропию (то есть низкий выход информации) на выполнение. Это означает, что они должны выполняться несколько раз, чтобы получить ту же самую информацию - свидетель линейного поиска.
В любом случае они берут O (длина слова) битовых сравнений, хотя, если длина слова < = длина регистра, сравнения происходят параллельно, возможно, с небольшой задержкой для переноса. (На самом деле, как я думаю, в типичном неравном случае любое сравнение может остановиться на первом неравном бите, и если вероятность равенства достаточно мала, это может произойти довольно рано.)
Один аспект, который все предполагают, заключается в том, что он говорит об инструкциях уровня регистров. Все правы, это в основном спорный вопрос на уровне процессора. И даже выше, самые высокоуровневые операции записывают неравенство как призыв к отрицанию равенства.
Однако, даже выше, использование оптимизации опрашивающего будет работать в обоих направлениях. То есть равенство можно записать так же эффективно, как и неравенство.
Кроме того, с точки зрения людей, занимающихся операциями сборки, единственная разница между CMP и SUB заключается в том, какие флаги установлены. Обычно они выполняются с одними и теми же частями машины, поскольку CMP должен возвращать флаги, которые представляют равенство, меньшее и большее чем.