奇妙な問題が 1 つあります。次のコードがあります。
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、デュアルコア プロセッサ)。
最適化レベル の VC6 コンパイラを使用していますO2
。使用されるその他のコンパイラ オプションは次のとおりです。
-MD -O2 -Z7 -GR -GX -G5 -X -GF -EHa
コンパイラの最適化を疑い、コンパイラの最適化を削除しました/O2
。その後、関数が正常になり、古いコードとして 100ms かかっています。
誰かがこの奇妙な振る舞いに光を当てることができますか?
未使用の変数を削除すると、コンパイラの最適化によりパフォーマンスが低下するのはなぜですか?
注: アセンブリ コード (変更前と変更後) は同じように見えました。