У меня есть одна странная проблема. У меня следующий фрагмент кода:Оптимизация компилятора, замедляющая производительность
template<clss index, class policy>
inline int CBase<index,policy>::func(const A& test_in, int* srcPtr ,int* dstPtr)
{
int width = test_in.width();
int height = test_in.height();
double d = 0.0; //here is the problem
for(int y = 0; y < height; y++)
{
//Pointer initializations
//multiplication involving y
//ex: int z = someBigNumber*y + someOtherBigNumber;
for(int x = 0; x < width; x++)
{
//multiplication involving x
//ex: int z = someBigNumber*x + someOtherBigNumber;
if(soemCondition)
{
// floating point calculations
}
*dstPtr++ = array[*srcPtr++];
}
}
}
Внутренний цикл запускается на выполнение около 200 000 раз, и вся функция принимает 100 мс для завершения. (профилированный с использованием AQTimer)
Я нашел неиспользованную переменную double d = 0.0;
вне внешней петли и удалил ее. После этого изменения внезапно метод принимает 500 мс для того же количества исполнений. (В 5 раз медленнее).
Такое поведение воспроизводится на разных машинах с различными типами процессоров. (процессоры Core2, dualcore).
Я использую компилятор VC6 с уровнем оптимизации O2
. Follwing являются другими параметрами компилятора, используемые:
-MD -O2 -Z7 -GR -GX -G5 -X -GF -EHa
Я подозревал оптимизацию компилятора и извлекал оптимизацию компилятора /O2
. После этого функция стала нормальной, и она принимает 100 мс в качестве старого кода.
Может ли кто-нибудь пролить свет на это странное поведение?
Почему оптимизация компилятора должна замедлять работу при удалении неиспользуемой переменной?
Примечание: код сборки (до и после изменения) выглядел так же.
Вы уверены, что сборка выглядела одинаково? Разве это «выглядело одинаково» или это точно так же? – jalf
его точно так же. –