プログラムのプロファイルを作成しましたが、基本的に次の式の評価に CPU 時間の 20% を費やしています。
abs(x) > abs(y)
ここで、x、y は倍精度浮動小数点変数です。
式をより高速なバリアントにリファクタリングする方法はありますか?
次の行 (2 つの異なる場所で呼び出されます) は、各行で 10% 近くの CPU 時間を消費します。
(これは関数 Image_3::TestGradientAtPoint からの抜粋です)
if (abs(maxx[ch]) < abs(a)) maxx[ch] = a;
01187AC9 mov eax,dword ptr [ch]
01187ACC sub esp,8
01187ACF fld qword ptr [ebp+eax*8-68h]
01187AD3 fstp qword ptr [esp]
01187AD6 call abs (11305F9h)
01187ADB fld qword ptr [ebp-70h]
01187ADE fstp qword ptr [esp]
01187AE1 fstp qword ptr [ebp-0F8h]
01187AE7 call abs (11305F9h)
01187AEC add esp,8
01187AEF fcomp qword ptr [ebp-0F8h]
01187AF5 fnstsw ax
01187AF7 test ah,41h
01187AFA jne Image_3::TestGradientAtPoint+176h (1187B06h)
01187AFC mov eax,dword ptr [ch]
01187AFF fld qword ptr [ebp-70h]
01187B02 fstp qword ptr [ebp+eax*8-68h]
プロファイラーは、abs() の呼び出しに 20% の CPU 時間がかかったと述べています。私は10 ^ 8回の反復でメソッドを呼び出しています-私は大きな画像を扱っています。
編集
言い忘れましたが、コードはデバッグ モードで実行されます。ここで少し最適化する必要があります。MSVC デバッガーを適切な時間内に使用できるようにしたいからです。