VS2015 C++/MFCアプリケーションをVS2015に移植し、VS2015コンパイラによって生成されたパフォーマンスとコードにかなり厄介な問題があります。Visual Studio 2015でのlog10()パフォーマンスが、Visual Studio 2013 for x86よりずっと遅い
メモこれはx86用です。
log10()呼び出しではそれよりも遅くなります。 CPUサンプリングを使用してリリースビルドをプロファイリングするとき、これらの呼び出しが以前よりも多くの時間を要することがわかります。例: VS2015の同じランで49サンプル、VS2015で同じランで7545サンプル。これは、この機能が問題のアプリケーションのCPU負荷の0.6%から50%になることを意味します。 VS2013プロファイラで
は示していますVS2015プロファイラで
Function Name Inclusive Samples Exclusive Samples Inclusive Samples % Exclusive Samples %
__libm_sse2_log10 49 49 0.61 0.61
は示しています
Function Name Inclusive Samples Exclusive Samples Inclusive Samples % Exclusive Samples %
___sse2_log102 7,545 7,545 50.43 50.43
なぜ別の関数名?
log10の生成されたアセンブリを簡単に見ました。 VS2013では、これはdisp_pentium4.inc
とlog10_pentium4.asm
に転送されます。 VS2015ではこれが異なります。それはVS2015がデバッグの__libm_sse2_log10
に戻るようです。
__sse2_log102
は、このパフォーマンスの違いだけの原因になることはありますか?これらを呼び出す関数から出力された結果は、予想される浮動小数点の違いの範囲内にあることを確認しました。
すべてのプロジェクト設定は、次のとおりです。プロパティを表示するとき
/Yu"stdafx.h" /MP /GS- /GL /analyze- /W4 /wd"4510" /wd"4610" /Zc:wchar_t /Z7 /Gm- /Ox /Ob2 /Zc:inline /fp:fast /D "WINVER=0x0501" /D "WIN32" /D "_WINDOWS" /D "NDEBUG" /D "_CRT_SECURE_NO_WARNINGS" /D "_CRT_SECURE_NO_DEPRECATE" /D "_SCL_SECURE_NO_WARNINGS" /D "_USING_V110_SDK71_" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /GR /arch:SSE2 /Gd /Oy /Oi /MT
また、ここに示す:
私たちは、目標v140_xpでコンパイルされており、以下のコンパイルオプションがいますVS2013とVS2015の両方で同じです。 SSE2を使用しており、浮動小数点モデルを高速に設定していることに注意してください。
誰もが同じ問題を抱えており、これを解決する方法を知っていますか?
マイクロソフトが実質的にライブラリを書き直したということがあります。 [このブログの記事](http://blogs.msdn.com/b/vcblog/archive/2015/09/25/rejuvenating-the-microsoft-c-c-compiler.aspx)には、数学ライブラリが含まれています。おそらく、あなたが比較する2つのバージョンの間で書き換えが起こります。 –
VS2015の "__sse2_log102"実装に向いている点がすべて原因です。古い実装よりも遅いです。 「log10()」の呼び出しをippsLog10_64f_A53の呼び出しに置き換えると、このパフォーマンス回帰は削除されます。 – nietras
@PeterSchneiderありがとうございました。はい、私たちはポートに浮動小数点から文字列の書式設定に関する問題があったため、これについて認識していました。これも完全に書き直されています。 – nietras