У меня есть сегмент кода, который очень прост:
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, был просто странным примером, с которым я столкнулся в процессе.