Компилятор Intel C ++ понимает, какая оптимизация выполняется

У меня есть сегмент кода, который очень прост:

for( int i = 0; i < n; ++i)
{
  if( data[i] > c && data[i] < r )
  {
    --data[i];
  }
}

Это часть большой функции и проекта. Фактически это переписывание другого цикла, который оказался трудоемким (длинные циклы), но я был удивлен двумя вещами:

Когда данные [i] временно хранились следующим образом:

for( int i = 0; i < n; ++i)
{
  const int tmp = data[i];
  if( tmp > c && tmp < r )
  {
    --data[i];
  }
}

Их стало намного больше. помедленнее. Я не утверждаю, что это должно быть быстрее, но я не могу понять, почему это должно быть намного медленнее, компилятор должен уметь определять, следует ли использовать tmp или нет.

Но что более важно, когда я переместил код сегмент в отдельную функцию он стал примерно в четыре раза медленнее. Я хотел понять, что происходит, поэтому я посмотрел в opt-report, и в обоих случаях цикл векторизован и, похоже, выполняет ту же оптимизацию.

Итак, мой вопрос в том, что может иметь такое значение для функции, которая не вызывается миллион раз, но сама по себе требует времени? Что искать в opt-отчете?

Я мог бы избежать этого, просто оставив его встроенным, но меня беспокоит почему.

ОБНОВЛЕНИЕ:

Я должен подчеркнуть, что моя главная задача - понять, почему он стал медленнее, когда он был перенесен в отдельную функцию. Пример кода, приведенный с переменной tmp, был просто странным примером, с которым я столкнулся в процессе.

5
задан Bo Jensen 4 February 2011 в 00:29
поделиться