Кои оператори за сравнение са по-ефективни за процесора: ‹, ‹=, != или ==?

Имам избор между типове операции за сравнение, моля, поставете ги в реда на ефективност за процесора, като започнете с най-ефективния:

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 GHz (или дори повече) тактова честота. Така че това би означавало 3200000000 операции в секунда, което е огромно число. Да предположим, че тези операции (които в крайна сметка са почти еднакви) използват 2 или 3 отметки. ще ви отнеме около 10^9 оператора, за да забележите значителна разлика.

person Kei    schedule 12.01.2014
comment
Беше просто като пример :) - person Kei; 12.01.2014