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
  {
   ...
  }
}

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

Другие вопросы по тегам