C/C++ наиболее эффективен, если оценка оператора
X верно в 99,9% случаев, но мне также нужно справиться с Y и Z. Хотя тело условия X пусто, я думаю, что это должно быть быстрее, чем проверка 2 других условий Y и Z, если условие X опущено. Как вы думаете?
if (likely(X))
{
}
else if (unlikely(Y))
{
...
}
else if (unlikely(Z))
{
...
}
4 ответа
Возможно, вы захотите узнать, что именно происходит, когда вы используете вероятные или маловероятные:
http://kerneltrap.org/node/4705
Я бы лично написал
if (unlikely(!X))
{
if (unlikely(Y))
{
...
}
else if (unlikely(Z))
{
...
}
}
Что означает, что если x
, продолжить выполнение, иначе перейти к если тело.
Как обычно, когда сомневаешься в профиле; во всяком случае, если бы я прочитал этот код, я нашел бы намного более ясное что-то вроде:
if (!likely(X))
{
if (unlikely(Y))
{
...
}
else if (unlikely(Z))
{
...
}
}
Если предполагается, что компилятор предпочитает первое условие true.
Вы можете использовать что-то вроде __builtin_expect
контролировать это (как подробно Уго).
Если это в цикле, вы должны измерить, потому что аппаратное обеспечение также является соображением - это не только источник и компилятор. Как работает ваш кеш и как работает предсказание ветвлений? Профиль. Alter. Профиль. Сравните.
Вы действительно нуждаетесь в маловероятных на y и z? Из вашего вопроса звучит так: если x не соответствует действительности, то y или z должны быть истинными, и в этом случае эти неправдоподобные значения неверны, и я бы сказал следующее:
if (unlikely(!X))
{
if (Y)
{
...
}
else //Z must be true
{
...
}
}
(Я бы написал комментарий к ответу Уго, но у меня недостаточно репутации, чтобы оставлять комментарии.)