Какие операторы сравнения более эффективны для процессора: ‹, ‹=, != или ==?

У меня есть выбор между типами операций сравнения, пожалуйста, расположите их в порядке эффективности для процессора, начиная с самого эффективного:

if (x == 1)

if (x != 0)

if (x < 2)

if (x <= 3)

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

Это то, что я всегда хотел знать, и, возможно, некоторые другие люди тоже хотят это знать. Кроме того, различается ли это для разных языков программирования или нет?

Изменить. Спасибо за информацию. Поскольку все они, по-видимому, имеют одинаковую эффективность, это означает, что я могу использовать больше операторов типа > или ‹, чтобы лучше отлавливать сбои!


person Amy Neville    schedule 12.01.2014    source источник
comment
Вы когда-нибудь слышали о преждевременной оптимизации? Ваш вопрос может претендовать на награду в этой категории...   -  person Rob W    schedule 12.01.2014
comment
Все они представляют собой одну инструкцию процессора. Нет разницы.   -  person PurkkaKoodari    schedule 12.01.2014
comment
Это не одна инструкция процессора в JavaScript...   -  person zmbq    schedule 12.01.2014
comment
@RobW Я знаю, о чем вы говорите, но, учитывая, что я могу использовать любой из них, и для ввода любого из них требуются одинаковые усилия, безусловно, это подпадает под педантичный стиль программирования, а не преждевременную оптимизацию :)   -  person Amy Neville    schedule 12.01.2014
comment
Используйте тот, который наиболее понятен читателю вашего кода.   -  person zmbq    schedule 12.01.2014
comment
@zmbq да, если все они невероятно быстры, то это, кажется, имеет смысл, хммм..... читабельность кода   -  person Amy Neville    schedule 12.01.2014
comment
Зачем тратить время на микрооптимизацию. Если вас так заботит производительность, выберите скомпилированный язык   -  person Ed Heal    schedule 12.01.2014
comment
@EdHeal Хе-хе, да, или, может быть, я могу ввести машинный код :)   -  person Amy Neville    schedule 12.01.2014
comment
@AmyNeville - Возможно, Java будет компромиссом   -  person Ed Heal    schedule 12.01.2014
comment
Это очень хороший вопрос. Это показывает, что вы думаете о своей работе и любопытны, а не просто делаете то, что вам сказали.   -  person Edward LeBlanc    schedule 28.05.2021


Ответы (3)


Как правило, любой из них более эффективен, чем другие. Это связано с тем, что на большинстве ЦП они сопоставляются со специализированными кодами операций, выполнение которых обрабатывается одним и тем же физическим устройством в несколько разных конфигурациях. Используя несуществующий, но очень простой для понимания синтаксис ассемблера, каждая ветвь (условие if) может быть преобразована в:

if (x == 1)
    test = x - 1
    branch_equal_zero test

if (x != 0)
    test = 0
    branch_non_equal_zero test

if (x < 2)
    test = x - 2
    branch_lower_than_zero test

if (x <= 3)
    test = x - 3
    branch_lower_or_equal_to_zero test

Как видите, сравнение с нулем (независимо от сравнения) может быть быстрее, потому что здесь не используется вычитание, но быстрее на такую ​​малую долю секунды, что вы можете заметите это только при очень большой нагрузке.

Даже если мы говорим об интерпретируемых языках (PHP и JS), ответ не меняется, потому что все операторы напрямую отображаются интерпретаторами на лежащие в их основе нативные сравнения. Не говоря уже о любом приведении типа или промежуточном преобразовании, которое может иметь место.

person Stefano Sanfilippo    schedule 12.01.2014
comment
интересно, потому что я всегда подозревал, что операторы типа ‹ немного медленнее. Но тогда эта микрооптимизация просто задалась вопросом. - person Amy Neville; 12.01.2014
comment
Ничего, что стоило бы усилий по профилированию и проверке. - person Stefano Sanfilippo; 12.01.2014

Простой ответ: «Они все одинаковые», потому что на базовом уровне они все одинаковые. Кроме того, все они настолько невероятно быстры, что вы все равно не заметите разницы.

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

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

person zmbq    schedule 12.01.2014

Скажем иначе, начиная с более высокого уровня. Javascript и PHP, оба они являются языками высокого уровня, поэтому не будут использовать ЦП напрямую, а поверх многих процессов, которые уже задуманы для оптимизации того, что вы пишете. В Javascript этот «процесс» называется Javascript Engine. В PHP это сам интерпретатор. Не поймите меня неправильно, считается, что они выполняют свою работу, оставляя «немного» заботы об оптимизации.

Так что, в конце концов, реальный способ оптимизировать такого рода операции — это найти действительно большую проблему в самом PHP или Javascript Engine.

Теперь давайте посмотрим на самый низкий аспект этих операторов. Современный процессор имеет тактовую частоту 3,2 ГГц (или даже больше). Таким образом, это будет означать 3200000000 операций в секунду, что является огромным числом. Допустим, те операции (которые в итоге почти все одинаковые) используют 2 или 3 тика. вам потребуется около 10 ^ 9 операторов, чтобы заметить значительную разницу.

person Kei    schedule 12.01.2014
comment
Это было просто из примера :) - person Kei; 12.01.2014