Я наткнулся на этот вопрос/ответ, в котором упоминается, что на большинстве языков логические операторы, такие как:
x == y && doSomething();
может быть быстрее, чем делать то же самое с веткой if
:
if(x == y) {
doSomething();
}
Точно так же он говорит, что тернарный оператор:
x = y == z ? 0 : 1
обычно быстрее, чем использование ветки if
:
if(y == z) {
x = 0;
} else {
x = 1;
}
Это заставило меня поискать в Google, что привело меня к этот фантастический ответ, объясняющий предсказание ветвлений.
По сути, это говорит о том, что ЦП работает на очень высоких скоростях, и вместо того, чтобы замедляться для вычисления каждой if
ветви, он пытается угадать, какой результат будет иметь место, и размещает соответствующие инструкции в своем конвейере. Но если он сделает неверное предположение, ему придется создать резервную копию и пересчитать соответствующие инструкции.
Но это все еще не объясняет мне, почему логические операторы или тернарный оператор обрабатываются иначе, чем if
ветвей. Поскольку центральный процессор не знает результата x == y
, не должен ли он по-прежнему гадать, поместить ли вызов doSomething()
(и, следовательно, весь код doSomething
) в свой конвейер? И, следовательно, резервное копирование, если его предположение было неверным? Точно так же для тернарного оператора не должен ли ЦП угадывать, будет ли y == z
оцениваться как true при определении того, что хранить в x
, и делать резервную копию, если его предположение было неверным?
Я не понимаю, почему если ветки обрабатываются компилятором иначе, чем любой другой оператор, который является условным. Разве все условные операторы не должны оцениваться одинаково?