У меня вопрос о флажках оптимизации GCC и о том, как они работают.C++ GCC Оптимизация Скорость замедляется, когда локальная переменная копируется в глобальную переменную
У меня очень длинный фрагмент кода, который использует все локальные массивы и переменные. В конце кода я копирую содержимое локального массива в глобальный массив. Здесь чрезвычайно разобранный пример моего кода:
uint8_t globalArray[16]={0};
void func()
{
unsigned char localArray[16]={0};
for (int r=0; r<1000000; r++)
{
**manipulate localArray with a lot of calculations**
}
memcpy(&globalArray,localArray,16);
}
Вот примерная скорость кода в трех различных сценариев:
Без «-O3» оптимизация: 3.203s
С "-O3" оптимизация: 1.457s
С «-O3» оптимизации и без окончательное
memcpy(&globalArray,localArray,16);
заявление: 0.015s
без копирования локального массива в глобальный массив, код работает почти в 100 раз быстрее. Я знаю, что глобальный массив хранится в памяти, а локальный массив хранится в регистрах. Я задал вопрос:
Почему простое копирование 16 элементов локального массива в глобальный массив вызывает 100-кратное более медленное выполнение? Я искал этот форум и онлайн, и я не могу найти определенного ответа на этот конкретный сценарий.
Есть ли способ, что я могу извлечь содержимое локальной переменной без потери скорости?
Благодарим вас за помощь всем, кто может помочь мне с этой проблемой.
В случае 3, возможно, компилятор удалил все вычисления, поскольку они не вызывают наблюдаемого поведения. Вы можете проверить это, проверив код сборки –
. Вы также можете вернуть указатель localArray из функции, что также помешает компилятору оптимизировать все содержимое функции. Это даст лучшее сравнение. – Conor
@Conor Это неопределенное поведение. – TartanLlama