C / C ++ наиболее эффективен, если оценка оператора - PullRequest
8 голосов
/ 20 января 2012

X истинно почти в 99,9% случаев, но мне нужно также обрабатывать Y и Z.Хотя тело условия X пусто, я думаю, что это должно быть быстрее, чем проверка 2 других условий Y и Z, если условие X опущено.Что ты думаешь?

if (likely(X))
{
}
else if (unlikely(Y))
{
...
}
else if (unlikely(Z))
{
...
}

Ответы [ 4 ]

11 голосов
/ 20 января 2012

Возможно, вы захотите узнать, что именно происходит, когда вы используете вероятное или маловероятное:
http://kerneltrap.org/node/4705

Я бы лично написал

if (unlikely(!X))
{
  if (unlikely(Y))
  {
  ...
  }
  else if (unlikely(Z))
  {
   ...
  }
}

Что означает, если x, продолжить выполнение, иначе перейти к телу if.

8 голосов
/ 20 января 2012

Как обычно, когда под вопросом профиль; во всяком случае, если бы я прочитал этот код, я нашел бы намного более ясное что-то вроде:

if (!likely(X))
{
    if (unlikely(Y))
    {
    ...
    }
    else if (unlikely(Z))
    {
    ...
    }
}
1 голос
/ 20 января 2012

Если предполагается, что компилятор предпочел бы первое условие true.

, вы можете использовать что-то вроде __builtin_expect для управления этим (как подробно Ugo).

Если этов цикле вы должны измерить, потому что аппаратное обеспечение также является соображением - это не только исходный код и компилятор.Как работает ваш кеш и как работает предсказание ветвления?Профиль.Alter.Профиль.Сравните.

0 голосов
/ 10 августа 2012

Вы действительно нуждаетесь в маловероятных на y и z?Ваш вопрос звучит так: если x не соответствует действительности, то y или z должны быть истинными, и в этом случае эти неправдоподобные значения неверны, и я бы сказал следующее:

if (unlikely(!X))
{
  if (Y)
  {
  ...
  }
  else //Z must be true
  {
   ...
  }
}

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

...