Дополнительно
Если заявление против if-else, в котором быстрее?
Я спорил с другом о тех двух фрагментов. Что быстрее и почему ?
value = 5;
if (condition) {
value = 6;
}
и:
if (condition) {
value = 6;
} else {
value = 5;
}
Что делать, если значение
- это матрица ?
Примечание: Я знаю, что значение = условие ? 6 : 5;
существует, и я ожидаю, что это будет быстрее, но это было'т вариант.
Редактировать (запрашиваемые сотрудниками, поскольку вопрос находится на удержании на данный момент):
- пожалуйста, ответьте на рассмотрении ассемблеру x86 порожденные основных компиляторов (сказал г++, лязг++, VC с помощью MinGW) в обоих оптимизированных и не оптимизированных версий или MIPS сборки.
- когда сборка отличаются, объяснить, почему версия работает быстрее и когда (например на "лучше, потому что нет ветвление и ветвление имеет следующую бла-бла вопрос на")
80
6
ТЛ;ДР: в неоптимизированном коде
если
, нееще
, кажется, невпопад эффективнее, но даже с самым базовым уровнем включенной оптимизации кода в принципе переписать какvalue = условие + 5
.Я дал ему попробовать]1 и создается сборка для следующий код:
На ССЗ 6.3 с оптимизацией отключена (
-О0
), соответствующая разница:для
Если бы только
, аоператору ifelse
имеетПоследняя выглядит чуть менее эффективен, поскольку имеет дополнительный прыжок, но оба имеют не менее двух и не более трех заданий, так что если вам действительно нужно, чтобы выжать каждую последнюю каплю производительности (подсказка: если вы работаете на космических челноках вы Don'т, и даже тогда вы probably Дон'т) разница выиграл'т быть заметно.
Однако, даже с самым низким уровнем оптимизации (
-О1
) обе функции сократить до той же:что в принципе эквивалентно
предполагая, что "условие" - это ноль или один. Более высокие уровни оптимизации Дон'т действительно изменить выход, если не удается избежать
movzx
эффективно обнуления регистраде-факто
на старте.Предупреждение: Вы, наверное,'т писать 5 + состояние себя (хотя стандарт гарантирует, что преобразование
правда
в целое число типа дает1
), потому что ваше намерение не может быть очевидным для людей, читающих ваш код (который может включать ваше будущее). Смысл этого кода, чтобы показать, что то, что компилятор производит в обоих случаях (практически) идентичны. Киприан Tomoiaga государства-это очень хорошо в комментариях:Ответ от CompuChip показывает, что для типа
int
они оба оптимизированы для одной и той же сборки, так это не'т вопрос.Я буду интерпретировать это в более общем виде, т. е. Что делать, если
значение
имеет тип, чья конструкций и назначений дорогие (и ходы дешево).тогда
неоптимально, потому что в состоянии дела `
это верно, вы делаете ненужные инициализации
init1, а потом выполнить задание копирования.Это лучше. Но все-таки оптимальным, если строительство по умолчанию стоит дорого и если строительство копия стоит дороже, то инициализация.
У вас есть условный оператор решение, что хорошо:
Или, если вы Don'т, как условный оператор, вы можете создать вспомогательную функцию такой:
В зависимости от того, что init1 и init2-вы также можете рассмотреть этот:
Но я опять должен подчеркнуть, что это актуально только тогда, когда строительство и задания очень дорогие для данного типа. И то, только по профайлинг вы знаете наверняка.
В псевдо-ассемблере,
в
may или может not быть быстрее, чем
в
в зависимости от того, насколько сложным фактического процессора. Переходя от простых до модных:
С ЦП любой произведенных после примерно 1990, хорошая производительность зависит от сторона Код в кэш инструкций. Когда в сомнении, следовательно, уменьшить размер кода. Это весит в пользу первого примера.
Базовый " ив-порядке, пятиступенчатый конвейер" и процессор, который до сих пор примерно то, что вы получаете во многих микроконтроллерах есть трубопровод пузырь каждый раз, когда филиал—условное или безусловное—взято, так что это также важно свести к минимуму количество отраслевых инструкций. Это также весит в пользу первого примера.
Несколько более сложных процессоров—фантазии хватило, чтобы сделать себе "для исполнения", но не фантазии достаточно, чтобы использовать наиболее известных реализаций этой концепции—может понести производство пузырьков, когда они сталкиваются запись после записи hazards. Это весит в пользу пример second, где
Р0
пишется только один раз несмотря ни на что. Эти процессоры обычно фантазии хватает на процесс безусловные переходы в сборщика инструкция, так что вы _aren', или просто торговле запись после записи штраф за ветку казни.Я не'т знать, если кто-то еще делает больше такого процессора. Однако, на процессорах, которые до использования в "самым известным реализациям" из вне-порядок выполнения правоподобны для того чтобы отрезать углы на менее часто используемые инструкции, так что вы должны знать, что такая вещь может случиться. Реальный пример ложных зависимостей по данным на назначение регистров в popcnt и lzcnt на Сэнди процессоров моста.
Если в ветке такое крайне непредсказуема, и ваш процессор имеет условное или условно-инструкции Move, это время, чтобы использовать их:
в
Ли #0, Р0 тест Р1 setne Р0
или
в
Ли #0, Р0 ли #1, Р2 тест Р1 мовне Р2, Р0
Условно-версия является более компактным, чем любой другой альтернативы; если это образование доступно практически гарантированно будет правильно в этом случае, даже если ветка была предсказуема. Условно-переместить версия требует дополнительного регистра нуля, и всегда отходы одного
литий
инструкция's стоимостью отправки и выполнения ресурсы; если бы ветка была в самом деле предсказуема, ветвистые версия вполне может быть быстрее.В коде unoptimised, первый пример присваивает переменной всегда сразу, а иногда и дважды. Во втором примере только один раз присваивает переменной. Условный одинаковый на обоих путях код, так что должны'т вопрос. В оптимизированный код, это зависит от компилятора.
Как всегда, если вы обеспокоены тем, что, произвести сборку и посмотреть, что компилятор на самом деле делает.
Что бы заставить вас думать, что любой из них даже один вкладыш быстрее или медленнее?
Несколько строк кода на языке высокого уровня дает компилятору больше работы, поэтому если вы хотите, чтобы правило о его дадут компилятор кода для работы. Если алгоритм такой же, как и вышеперечисленные случаи, то можно было бы ожидать компилятор с минимальной оптимизации, чтобы понять это.
не большой сюрприз в первый функционировать в разном порядке, если же время выполнения.
Надеюсь, вы поняли, вы могли бы просто попытался это, если это не было очевидно, что различных реализаций не были на самом деле разные.
Насколько матрицу идет, не знаю,как это важно,
просто собираюсь поставить же если-то-иначе обертка вокруг большой капли кода они значение=5 или что-то более сложное. Также для сравнения, даже если это большой кусок кода, это все равно должно быть вычислено, и равна или не равна-то часто составлены с отрицательным, если (условие) что-то делать часто составлены как бы не Гото состоянии.
мы просто прошли через это упражнение с кем-то недавно еще на сайте StackOverflow. этот компилятор для архитектуры MIPS интересно в этом случае не только осознал функций остались прежними, но была одна функция просто перейти к другому, чтобы экономить на пространстве кода. Не делай этого хоть здесь
больше некоторые цели.
и компиляторы
с этим я код можно было бы ожидать различных целей в матче
Сейчас технически нет разницы в производительности в некоторых из этих решений, иногда в результате 5 чехол имеет перепрыгнуть результат 6 кода, и наоборот, ветка быстрее, чем выполнение путем? можно возразить, но исполнение должно быть различным. Но это скорее если состояние против, если бы не условие в коде, в результате чего компилятор делать если перепрыгнуть еще через выполнить. но это не обязательно из-за стиля написания кода, но в сравнении, а если и остальные случаи в любой синтаксис.
ОК, после сборки один из тегов, я просто предполагаю, что ваш код-это псевдокод (и не обязательно C) и перевести его на человека в сборку 6502.
1-й вариант (без else)
2-й вариант (с другой)
Предположения: состояние находится в г реестр установить это значение на 0 или 1 на первой линии в любом варианте, результат будет в аккумуляторе.
Так, после подсчета циклов для обоих вариантов в каждом конкретном случае, мы видим, что 1-ая конструкция, как правило, быстрее; 9 циклов, когда состояние 0 и 10 циклов, когда условие 1, тогда как второй вариант-также 9 циклов, когда состояние 0, а 13 циклов, когда условие 1. (цикличные подсчеты не включают в себя
БРК
в конце).Вывод:
если только
быстрееесли-то
построить.И для полноты картины, вот это оптимизированная
значение = условие + решение 5
:Это сокращает наше время до 8 циклов (опять же не включая
БРК
в конце).