Что быстрее switch или if java

Условные операторы if и switch

На этом занятии поговорим об условных операторах. Что это такое? Представьте, что вам нужно вычислить модуль числа, хранящегося в переменной x. Как это сделать? Очевидно, нужно реализовать такой алгоритм.

Что быстрее switch или if java. Смотреть фото Что быстрее switch или if java. Смотреть картинку Что быстрее switch или if java. Картинка про Что быстрее switch или if java. Фото Что быстрее switch или if java

И в этом алгоритме есть вот такое ветвление программы: при x ) оператор;

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

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

Какие операторы сравнения существуют в JavaScript и как они работают? Многие из них нам известны из школьного курса математики, это:

Истинно, если a больше b

Истинно, если a больше или равно b

Сравнение разных типов данных

При сравнении значений разных типов JavaScript приводит каждое из них к числу. Например:

При сравнении булевых значений:

Внимание! Странное сравнение null с нулем:

Это просто нужно иметь в виду при программировании логики скриптов.

Строгое сравнение

В JavaScript можно выполнять сравнение двух значений с учетом их типа данных. Для этого используется оператор === (три равно). Применяя его к предыдущему примеру, получим:

Оба результата дадут ложь – false, так как значения, имеющие разные типы считаются не равными друг другу. Та же ситуация будет и при таком строгом сравнении:

Здесь также имеем разные типы данных, поэтому результат – false. А вот если взять строгое неравенство, то получим истину во всех случаях:

Вот так можно сравнивать между собой значения с учетом их типов.

Теперь, когда мы знаем как сравниваются между собой величины, вернемся к нашему условному оператору if. И предположим, что хотим определить знак числа в переменной x. Конечно, проверку можно записать вот так:

Но можно сделать лучше. Смотрите, мы здесь имеем дело со взаимоисключающими условиями, то есть, они не могут произойти одновременно: либо первое, либо второе. Для таких ситуаций можно использовать ключевое слово else – иначе, чтобы ускорить процесс проверки:

Теперь, у нас здесь всего одно условие. Если оно истинно, то выполнится первый console.log, а иначе – второй console.log. Такая программа будет работать быстрее.

В общем случае, синтаксис оператора if else следующий:

if( ) оператор 1;
else оператор 2;

И так как после else можно ставить любой оператор, то предыдущую программу можно записать и так:

И вообще таких конструкций if else может быть много. Далее, обратим внимание на такой факт: во всех наших примерах по условию шел один оператор – console.log. Но что если нужно выполнить несколько операторов по некоторому условию? Для этого их нужно заключать в фигурные скобки. Например:

Здесь по первым двум условиям выполняется два оператора: присвоение значения переменной sgn и вывод результата в консоль. В последнем else записан только один оператор – вывод в консоль, поэтому здесь фигурные скобки ставить не обязательно.

В ряде случаев конструкцию if else удобнее записывать через тернарный условный оператор, который имеет такой синтаксис:

Сначала вычисляется условие: если оно истинно, то возвращается значение1, в противном случае – значение2. Например:

Получим true, если возраст (age) больше 18, иначе – false. Кстати, проверку из данного примера можно сделать короче, просто прописав

здесь оператор > вернет true при возрасте больше 18 и false – в противном случае.

Теперь, когда мы разобрались с базовыми моментами проверки условий, сделаем следующий шаг и попробуем реализовать проверку попадания переменной x в диапазон [2; 7], то есть, условие должно быть истинным, когда x принимает значения в этом диапазоне чисел. Очевидно, что здесь должно быть две проверки: первая – мы проверяем, что x >= 2 и вторая – проверяем, что x 7, то делается вывод о невхождении переменной x в указанный диапазон.

Вот так можно записывать более сложные условия в условном операторе if. Причем они могут комбинироваться в любом сочетании, например:

Здесь реализована проверка, что x должно принадлежать [2; 7], а y не принадлежать [0; 5]. И обратите внимание вот на эти круглые скобки. Дело в том, что приоритет у операции && больше, чем у ||, поэтому без скобок у нас бы получилась вот такая проверка:

то есть, мы проверяли бы, что x принадлежит [2; 7] и y меньше нуля ИЛИ y больше 5. Как вы понимаете – это уже совсем другая проверка. Поэтому учитывайте приоритет этих операций при формировании составного условия. Если нужно изменить приоритет – используйте круглые скобки.

Одиночные проверки

Внутри условия можно прописывать и такие одиночные выражения:

Вот этот восклицательный знак – это отрицание – НЕ, то есть, чтобы проверить, что 0 – это false мы преобразовываем его в противоположное состояние с помощью оператора отрицания НЕ в true и условие срабатывает. Аналогично и с переменной z, которая равна false.

Вот так работает оператор if в JavaScript.

Оператор switch

Второй условный оператор switch используется, когда из множества возможных вариантов нужно выбрать какой-то один. Например, мы хотим проверить: принимает ли некая переменная одно из значений 1, 2, 3 или 4. Это будет выглядеть так:

И в консоле увидим, что item=3, 4 и другое значение. Почему так и как это все работает? В круглых скобках оператора switch записывается переменная, которая сравнивается со значениями (константами), указанными в case. Далее, через двоеточие пишутся операторы, которые выполняются при совпадении значения переменной с константой. В нашем случае item=3, срабатывает case 3 и выполняется console.log(«item = 3»). Но, оператор switch в JavaScript реализован так, что все последующие операторы тоже будут выполняться. В ряде случаев это бывает полезно и нужно. Если же мы хотим прервать выполнение оператора switch после успешной проверки, нужно записать оператор break вот так:

Теперь в консоле мы видим только строчку item=3. Операторы, стоящие после default выполняются, если не сработала ни одна из проверок. Это необязательное ключевое слово: switch может быть записан и без него, но тогда мы не увидим «item другое значение», если переменная не будет равна 1, 2, 3 или 4.

Так когда же использовать условный оператор if, а когда switch? Правило простое: если нужно проверить переменную на равенство множеству значений, то лучше использовать switch – он сработает быстрее, чем if. Во всех других случаях применяется оператор if.

В практике программирования в 99% случаев используется if и лишь для некоторых частных проверок – оператор switch.

Видео по теме

Что быстрее switch или if java. Смотреть фото Что быстрее switch или if java. Смотреть картинку Что быстрее switch или if java. Картинка про Что быстрее switch или if java. Фото Что быстрее switch или if java

JavaScipt #1: что это такое, с чего начать, как внедрять и запускать

Что быстрее switch или if java. Смотреть фото Что быстрее switch или if java. Смотреть картинку Что быстрее switch или if java. Картинка про Что быстрее switch или if java. Фото Что быстрее switch или if java

JavaScipt #2: способы объявления переменных и констант в стандарте ES6+

Что быстрее switch или if java. Смотреть фото Что быстрее switch или if java. Смотреть картинку Что быстрее switch или if java. Картинка про Что быстрее switch или if java. Фото Что быстрее switch или if java

JavaScript #3: примитивные типы number, string, Infinity, NaN, boolean, null, undefined, Symbol

Что быстрее switch или if java. Смотреть фото Что быстрее switch или if java. Смотреть картинку Что быстрее switch или if java. Картинка про Что быстрее switch или if java. Фото Что быстрее switch или if java

JavaScript #4: приведение типов, оператор присваивания, функции alert, prompt, confirm

Что быстрее switch или if java. Смотреть фото Что быстрее switch или if java. Смотреть картинку Что быстрее switch или if java. Картинка про Что быстрее switch или if java. Фото Что быстрее switch или if java

Что быстрее switch или if java. Смотреть фото Что быстрее switch или if java. Смотреть картинку Что быстрее switch или if java. Картинка про Что быстрее switch или if java. Фото Что быстрее switch или if java

JavaScript #6: условные операторы if и switch, сравнение строк, строгое сравнение

Что быстрее switch или if java. Смотреть фото Что быстрее switch или if java. Смотреть картинку Что быстрее switch или if java. Картинка про Что быстрее switch или if java. Фото Что быстрее switch или if java

JavaScript #7: операторы циклов for, while, do while, операторы break и continue

Что быстрее switch или if java. Смотреть фото Что быстрее switch или if java. Смотреть картинку Что быстрее switch или if java. Картинка про Что быстрее switch или if java. Фото Что быстрее switch или if java

JavaScript #8: объявление функций по Function Declaration, аргументы по умолчанию

Что быстрее switch или if java. Смотреть фото Что быстрее switch или if java. Смотреть картинку Что быстрее switch или if java. Картинка про Что быстрее switch или if java. Фото Что быстрее switch или if java

JavaScript #9: функции по Function Expression, анонимные функции, callback-функции

Что быстрее switch или if java. Смотреть фото Что быстрее switch или if java. Смотреть картинку Что быстрее switch или if java. Картинка про Что быстрее switch или if java. Фото Что быстрее switch или if java

JavaScript #10: анонимные и стрелочные функции, функциональное выражение

Что быстрее switch или if java. Смотреть фото Что быстрее switch или if java. Смотреть картинку Что быстрее switch или if java. Картинка про Что быстрее switch или if java. Фото Что быстрее switch или if java

JavaScript #11: объекты, цикл for in

Что быстрее switch или if java. Смотреть фото Что быстрее switch или if java. Смотреть картинку Что быстрее switch или if java. Картинка про Что быстрее switch или if java. Фото Что быстрее switch или if java

JavaScript #12: методы объектов, ключевое слово this

Что быстрее switch или if java. Смотреть фото Что быстрее switch или if java. Смотреть картинку Что быстрее switch или if java. Картинка про Что быстрее switch или if java. Фото Что быстрее switch или if java

JavaScript #13: клонирование объектов, функции конструкторы

Что быстрее switch или if java. Смотреть фото Что быстрее switch или if java. Смотреть картинку Что быстрее switch или if java. Картинка про Что быстрее switch или if java. Фото Что быстрее switch или if java

JavaScript #14: массивы (array), методы push, pop, shift, unshift, многомерные массивы

Что быстрее switch или if java. Смотреть фото Что быстрее switch или if java. Смотреть картинку Что быстрее switch или if java. Картинка про Что быстрее switch или if java. Фото Что быстрее switch или if java

JavaScript #15: методы массивов: splice, slice, indexOf, find, filter, forEach, sort, split, join

Что быстрее switch или if java. Смотреть фото Что быстрее switch или if java. Смотреть картинку Что быстрее switch или if java. Картинка про Что быстрее switch или if java. Фото Что быстрее switch или if java

JavaScript #16: числовые методы toString, floor, ceil, round, random, parseInt и другие

Что быстрее switch или if java. Смотреть фото Что быстрее switch или if java. Смотреть картинку Что быстрее switch или if java. Картинка про Что быстрее switch или if java. Фото Что быстрее switch или if java

Что быстрее switch или if java. Смотреть фото Что быстрее switch или if java. Смотреть картинку Что быстрее switch или if java. Картинка про Что быстрее switch или if java. Фото Что быстрее switch или if java

JavaScript #18: коллекции Map и Set

Что быстрее switch или if java. Смотреть фото Что быстрее switch или if java. Смотреть картинку Что быстрее switch или if java. Картинка про Что быстрее switch или if java. Фото Что быстрее switch или if java

JavaScript #19: деструктурирующее присваивание

Что быстрее switch или if java. Смотреть фото Что быстрее switch или if java. Смотреть картинку Что быстрее switch или if java. Картинка про Что быстрее switch или if java. Фото Что быстрее switch или if java

JavaScript #20: рекурсивные функции, остаточные аргументы, оператор расширения

Что быстрее switch или if java. Смотреть фото Что быстрее switch или if java. Смотреть картинку Что быстрее switch или if java. Картинка про Что быстрее switch или if java. Фото Что быстрее switch или if java

JavaScript #21: замыкания, лексическое окружение, вложенные функции

Что быстрее switch или if java. Смотреть фото Что быстрее switch или if java. Смотреть картинку Что быстрее switch или if java. Картинка про Что быстрее switch или if java. Фото Что быстрее switch или if java

JavaScript #22: свойства name, length и методы call, apply, bind функций

Что быстрее switch или if java. Смотреть фото Что быстрее switch или if java. Смотреть картинку Что быстрее switch или if java. Картинка про Что быстрее switch или if java. Фото Что быстрее switch или if java

JavaScript #23: создание функций (new Function), функции setTimeout, setInterval и clearInterval

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

Источник

Why switch is faster than if

Lots of Java books describe the switch statement as being faster than the if else statement. But I did not find out anywhere why switch is faster than if.

Example

I have a situation I have to choose any one item out of two. I can use either use

considering item and BREAD is a constant int value.

In the above example which is faster in action and why?

Что быстрее switch или if java. Смотреть фото Что быстрее switch или if java. Смотреть картинку Что быстрее switch или if java. Картинка про Что быстрее switch или if java. Фото Что быстрее switch или if java

5 Answers 5

Because there are special bytecodes that allow efficient switch statement evaluation when there are a lot of cases.

If implemented with IF-statements you would have a check, a jump to the next clause, a check, a jump to the next clause and so on. With switch the JVM loads the value to compare and iterates through the value table to find a match, which is faster in most cases.

Что быстрее switch или if java. Смотреть фото Что быстрее switch или if java. Смотреть картинку Что быстрее switch или if java. Картинка про Что быстрее switch или if java. Фото Что быстрее switch или if java

A switch statement is not always faster than an if statement. It scales better than a long list of if-else statements as switch can perform a lookup based on all the values. However, for a short condition it won’t be any faster and could be slower.

The current JVM has two kinds of switch byte codes: LookupSwitch and TableSwitch.

Each case in a switch statement has an integer offset, if these offsets are contiguous (or mostly contiguous with no large gaps) (case 0: case 1: case 2, etc.), then TableSwitch is used.

If the offsets are spread out with large gaps (case 0: case 400: case 93748:, etc.), then LookupSwitch is used.

The difference, in short, is that TableSwitch is done in constant time because each value within the range of possible values is given a specific byte-code offset. Thus, when you give the statement an offset of 3, it knows to jump ahead 3 to find the correct branch.

Lookup switch uses a binary search to find the correct code branch. This runs in O(log n) time, which is still good, but not the best.

So as far as which one is fastest, use this approach: If you have 3 or more cases whose values are consecutive or nearly consecutive, always use a switch.

If you have 2 cases, use an if statement.

For any other situation, switch is most likely faster, but it’s not guaranteed, since the binary-search in LookupSwitch could hit a bad scenario.

Also, keep in mind that the JVM will run JIT optimizations on if statements that will try to place the hottest branch first in the code. This is called «Branch Prediction». For more information on this, see here: https://dzone.com/articles/branch-prediction-in-java

Your experiences may vary. I don’t know that the JVM doesn’t run a similar optimization on LookupSwitch, but I’ve learned to trust the JIT optimizations and not try to outsmart the compiler.

Что быстрее switch или if java. Смотреть фото Что быстрее switch или if java. Смотреть картинку Что быстрее switch или if java. Картинка про Что быстрее switch или if java. Фото Что быстрее switch или if java

So if you plan to have loads of packets memory isn’t really a large cost these days and arrays are pretty fast. You also cannot rely on a switch statement to auto generate a jump table and as such it’s easier to generate the jump table scenario yourself. As you can see in below example we assume a maximum of 255 packets.

To get the below result your need abstraction.. i’m not going to explain how that works so hopefully you have an understanding of that.

I updated this to set the packet size to 255 if you need more then that you’ll have to do a bounds check for (id length).

Edit since I use a Jump Table in C++ a lot now i’ll show an example of a function pointer jump table. This is a very generic example, but I did run it and it works correctly. Keep in mind you must set the pointer to NULL, C++ will not do this automatically like in Java.

Also another point i’d like to bring up is the famous Divide and Conquer. So my above 255 array idea could be reduced to no more then 8 if statements as a worst case scenario.

Источник

Java: If vs. Switch

Some of the answers below regard alternative approaches to the approach above.
I have included the following to provide context for its use.

The reason I asked, the Question above, was because the speed of adding words empirically improved.

This isn’t production code by any means, and was hacked together quickly as a PoC.

Что быстрее switch или if java. Смотреть фото Что быстрее switch или if java. Смотреть картинку Что быстрее switch или if java. Картинка про Что быстрее switch или if java. Фото Что быстрее switch или if java

11 Answers 11

Don’t worry about performance; use the syntax that best expresses what you’re doing. Only after you have (a) demonstrated a performance deficiency; and (b) localized it to the routine in question, only then should you worry about performance. For my money, the case syntax is more appropriate here.

However, heavily used code is typically compiled in any sensible JVM. The optimiser is not entirely stupid. Don’t worry about it, and follow the usual heuristics for optimisation.

Что быстрее switch или if java. Смотреть фото Что быстрее switch или if java. Смотреть картинку Что быстрее switch или if java. Картинка про Что быстрее switch или if java. Фото Что быстрее switch или if java

It looks like you have enumerated the values so perhaps an enumeration is in order?

Also, there is a possible bug in your code where «A» == «A» may be false depending on the object identity of the «A»‘s.

Not quite an answer to your question, but there’s actually a bug in your code, you should have a break after each case:

I don’t think performance differences are going to be too significant here, but if you really care about performance, and if this code is executed very frequently, here’s another option:

Be sure to encapsulate this and document it well though.

Honestly, I don’t think the performance matters in this case. It’s really up to the compiler and its optimization.

If you have a switch statement with consecutive, integral values, depending on the language, it may be optimized to a branch table, which is very quick. It’s not slower, anyway!

Additionally, using if/else if would be an improvement over if, for cases such as this one in which your cases are mutually exclusive. No sense making 25 more checks after matching A.

But basically, any performance difference is negligible, and you ought to use the most correct syntax, which in this case is the switch statement. Make sure to separate your cases with breaks though.

Here’s a way to avoid all of the case statements.

I know this is not what you are asking at all, but aren’t you just doing this?

Are you simply looking for something a little more memory efficient?

The switch statement should use a hash to select which case to go to. From there, every subsequent case will also be run if there are no break statements. For example, with your code, if you switch on X, it will immediately go to X, then Y, then Z. See the Java Tutorial.

Источник

«Switch» быстрее, чем «if»?

это switch сообщении на самом деле быстрее if заявление?

я запустил приведенный ниже код в компиляторе x64 C++ Visual Studio 2010 с помощью /Ox флаг:

и получил следующие результаты:

переключатель заявление: 5261 ms
Оператор If: 5196 ms

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

вопросы:

как будет выглядеть базовая таблица переходов в x86 или x64?

этот код использует таблицу перехода?

почему в этом примере нет разницы в производительности? Есть ли какая-либо ситуация, в которой и существенная разница в производительности?

обновление:

интересные результаты здесь. Не уверен, почему один быстрее,а другой медленнее.

12 ответов

существует несколько оптимизаций компилятора can сделайте на переключателе. Я не думаю, что часто упоминаемый «jump-table» очень полезен, поскольку он работает только тогда, когда вход может быть ограничен каким-то образом.

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

чтобы ответить на ваши конкретные вопросы:

Clang генерирует тот, который выглядит как этой:

решение на основе таблицы переходов не использует сравнение вообще.

1.Как будет выглядеть базовая таблица переходов в x86 или x64?

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

Что быстрее switch или if java. Смотреть фото Что быстрее switch или if java. Смотреть картинку Что быстрее switch или if java. Картинка про Что быстрее switch или if java. Фото Что быстрее switch или if java

2.Этот код использует таблицу перехода? В данном случае-нет.

3.Почему в этом примере нет разницы в производительности?

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

4.Существует ли какая-либо ситуация, в которой существует значительная разница в производительности?

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

девиз: компилятор достаточно умен, чтобы справиться с таким случаем:)

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

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

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

откуда вы знаете, что ваш компьютер не выполнял какую-то задачу, не связанную с тестом во время цикла тестирования коммутатора, и выполнял меньше задач во время цикла тестирования if? Ваши результаты теста не показывают ничего, как:

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

другая проблема с вашим кодом:

в цикле переключения, против

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

О, и я думаю, что вы также должны сбросить счетчик между тестами. На самом деле, вы, вероятно, должны использовать какое-то случайное число вместо +1, +2, +3 и т. д., Поскольку это, вероятно, оптимизирует что-то там. Под случайным числом я имею в виду число, основанное на текущем времени, например. В противном случае, компилятор может превратить ваши функции в одном длинная математическая операция и даже не беспокоиться о каких-либо петлях.

Я изменил код Райана достаточно, чтобы убедиться, что компилятор не мог понять вещи до запуска кода:

переключатель: 3740
если: 3980

(аналогичные результаты за несколько попыток)

Я также уменьшил количество случаев / ifs до 5, и функция переключателя все еще выиграла.

хороший оптимизирующий компилятор, такой как MSVC, может генерировать:

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

Я отвечу 2) и сделаю несколько общих замечаний. 2) нет, в коде сборки, который вы разместили, нет таблицы перехода. Таблица переходов-это таблица назначений переходов и одна или две инструкции для перехода непосредственно в индексированное местоположение из таблицы. Таблица перехода будет иметь больше смысла, когда есть много возможных направлений переключения. Возможно, оптимизатор знает, что просто, если логика else быстрее, если количество назначений не превышает некоторого порога. Попробуйте еще раз пример с say 20 возможностей вместо 4.

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

Если вы получаете 40 операторов if и добавляете случай 0, то блок if будет работать медленнее, чем эквивалентный оператор switch. У меня результаты вот: https://www.ideone.com/KZeCz.

эффект удаления случая 0 можно увидеть здесь:https://www.ideone.com/LFnrX.

нет, это если затем прыгать еще, если затем прыгать еще. Таблица перехода будет иметь таблицу адресов или использовать хэш или что-то в этом роде.

быстрее или медленнее субъективно. Например, случай 1 может быть последним, а не первым, и если ваша тестовая программа или программа реального мира использовали случай 1 большую часть времени, код будет медленнее с этой реализацией. Поэтому просто перестановка списка дел, в зависимости от реализации, может сделать большой разница.

не уверен, почему один быстрее,а другой медленнее.

это на самом деле не слишком сложно объяснить. Если вы помните, что неправильно интерпретированные ветви в десятки-сотни раз дороже, чем правильно предсказанные ветви.

на % 20 версия, первый случай / если всегда тот, который попадает. Современные процессоры «узнают», какие ветви обычно берутся, а какие нет, поэтому они могут легко предсказать, как эта ветвь будет вести себя почти каждая итерация цикла. Это объясняет, почему версия «if» летает; она никогда не должна выполнять что-либо после первого теста, и она (правильно) предсказывает результат этого теста для большинства итераций. Очевидно, что «переключатель» реализован немного иначе-возможно, даже таблица переходов, которая может быть медленной благодаря вычисляемой ветви.

на % 21 версия, ветви по существу случайны. Поэтому многие из них не только выполняют каждую итерацию, CPU не может угадать в какую сторону они пойдут. Это тот случай, когда таблица переходов (или другая оптимизация «коммутатора»), вероятно, поможет.

очень трудно предсказать, как часть кода будет работать с современным компилятором и процессором, и это становится все труднее с каждым поколением. Лучший совет: «даже не пытайтесь; всегда профиль». Этот совет становится лучше-и число людей, которые могут успешно игнорировать его, уменьшается-с каждым годом.

все это означает, что мой объяснение выше в значительной степени является догадкой. 🙂

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

(1) Если в случаях есть порядок, а не худший случай тестирования для всех N, вы можете написать свои if, чтобы проверить, если в верхней или нижней половине, то в каждой половине этого, двоичный стиль поиска. в результате в худшем случае logN, а не N

(2) если некоторые случаи / группы гораздо чаще, чем другие случаи, то проектирование ваше если изолировать эти случаи сначала может ускорить среднее время через

вот некоторые результаты из старого (теперь трудно найти) bench++ benchmark:

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

Кажется мне правильным выражением приращения, которое вы должны использовать.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *