5

デバッグ モードでプログラムのデバッグに時間がかかる理由を突き止めようとしています。xperf を使用してスタックの様子を確認したところ、イテレータと STL コンテナに膨大な時間を費やしていることが明らかになりました。私はこれをしばらくグーグルで検索し、オプションを見つけました

_HAS_ITERATOR_DEBUGGING=0
_SECURE_SCL=0
_SECURE_SCL_THROWS=0

そして、#define を使用してコードでそれらすべてを設定します

#define _HAS_ITERATOR_DEBUGGING 0
#define _SECURE_SCL 0
#define _SECURE_SCL_THROWS 0

しかし、それはうまくいかないようだったので、ビジュアルスタジオプロジェクト内のプリプロセッサ定義を使用して試しましたが、それでも役に立たないようでした.

ヘッダーに設定するなど、考えられるほぼすべての順列を試しましたが、すべてのインクルードの後、何をしても、デバッグ中のパフォーマンスの向上は見られません。一例を挙げると、リリースモードで実行すると、この一連の操作に約 140 秒かかります。デバッグ モードでは、2,400 秒強かかります。処理時間が約 17 ~ 18 倍増加します。

追加情報として、これらの C++ dll をホストするプロセスは C# .net 4 プロセスであり、アンマネージ コードのデバッグを有効にしました。基本的に、すべてのプロセスで DLL が読み込まれます。実際の作業はすべて C++ コードで行われます。

以下に完全なコンパイラ コマンド ラインを含めます。

/I"..\CommonInclude" /Zi /nologo /W4 /WX /Od /Oy- /D "_CRT_SECURE_NO_WARNINGS" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_USRDLL" /D "ENGINE_EXPORTS" /D "_HAS_ITERATOR_DEBUGGING=0" /D "_SECURE_SCL=0" /D "_SECURE_SCL_THROWS=0" /D "_VC80_UPGRADE=0x0710" /D "_WINDLL" /D "_MBCS" /Gm- /EHa /MDd /GS /fp:precise /Zc:wchar_t- /Zc:forScope /GR /Yu"StdAfx.h" /Fp".\Debug/Foo.pch" /Fa".\Debug/" /Fo".\Debug/" /Fd".\Debug/" /Gd /analyze- /errorReport:queue /EHa -Zm350 /MP3 

これがこれほど遅い理由は何ですか?

4

3 に答える 3

7

あなたの説明に基づいて、これはすぐに飛び出します:

デバッグ モードのときにプログラムのデバッグに時間がかかる理由を突き止めようとしています。xperf を使用してスタックの様子を確認したところ、イテレータとSTL コンテナに膨大な時間を費やしていることが明らかになりました。

ノードベースのコンテナー ( 、、mapsetunordered_map、など) を使用し、デバッガーから実行すると、これらのコンテナーが小さなサイズの大量のオブジェクトを割り当てていることに起因する問題が発生する可能性があります。Windows でデバッガーからアプリケーションを実行すると、OS はプロセス ヒープをデバッグ ヒープに切り替えます。負荷がかかっているノードベースのコンテナーが多数ある場合、それらを解放するには、デバッグ ヒープで多くの時間がかかります。unordered_setmultimapmultisetlist

簡単な修正は、デバッグ オプションの環境セクションに次を追加して、デバッグ ヒープを無効にすることです。_NO_DEBUG_HEAP=1

これにより、デバッグ ヒープが無効になります。

于 2012-05-15T22:37:10.887 に答える
1

試すべきことがいくつかあります:

  • プロファイラーを使用します。たとえば、無料のAMD CodeAnalystを使用すると、コールスタックが提供され、一般的にXperfよりもはるかに使いやすくなります。デバッグコードを扱っている場合でも、いくつかのホットスポットが見つかる可能性があります
  • 最適化をオフにしてリリースビルドを作成します(これには別の構成を作成できます)。これにより、イテレータのデバッグがオフになります(これが速度低下の原因である場合)が、生のリリースビルドよりもはるかに有用なデバッグ情報が得られる可能性があります。フレームポインタを省略するオプションが有効になっていることを確認します
于 2012-05-15T22:24:12.803 に答える
1

大きな違いを生む1つのことは、デフォルトでは関数がデバッグモードでインライン化されないことです。これにより、多くの小さなアクセサ関数を使用してコーディングする時間が長くなります。

イテレータに依存せずに、デバッグモードとリリースモードの違いが100倍以上になるプログラムがあります。

于 2012-05-15T21:53:20.913 に答える