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

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Компилятор Intel C++ понимает, какая оптимизация выполняется.

Сообщение Anonymous »

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

Код: Выделить всё

for( int i = 0; i < n; ++i)
{
if( data[i] > c && data[i] < r )
{
--data[i];
}
}
Это часть большой функции и проекта. На самом деле это переписывание другого цикла, который отнимает много времени (длинные циклы), но меня удивили две вещи:

Когда data было временно хранится так:

Код: Выделить всё

for( int i = 0; i < n; ++i)
{
const int tmp = data[i];
if( tmp > c && tmp < r )
{
--data[i];
}
}
Он стал намного медленнее. Я не утверждаю, что это должно быть быстрее, но я не могу понять, почему это должно быть настолько медленнее, компилятор должен уметь определять, следует ли использовать tmp или нет.

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

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

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

ОБНОВЛЕНИЕ:

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

Подробнее здесь: https://stackoverflow.com/questions/489 ... -performed
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»