8

中規模のネイティブ C++ アプリケーションがあります。Visual Studio (2008) 内から実行すると、Visual Studio の外部から実行した場合よりも約 10 倍遅くなります。これは、デバッグ ビルドとリリース ビルドの両方に適用され、Start Debugging(F5) およびStart Without Debugging(Ctrl+F5) としてアプリケーションを実行したときに発生します。

つまり、デバッガーを使用せずに Visual Studio でリリース ビルドを実行すると、コマンド プロンプト (または Windows エクスプローラー) から同じ実行可能ファイルを実行するよりも 10 倍遅くなります。

私が試したこと:

  • ブレークポイント、トレースポイント、例外デバッグなどが設定されていないことを再確認します。何もありませんでした。
  • _NO_DEBUG_HEAP=1アプリの VS Debugging プロパティの設定。無効。
  • アプリ自体の代わりに Ctrl+F5 で実行するように設定し、それを VS の外部で利用可能なcmd /c set PATHものと比較します。PATH変わりはない。
  • exe で DependencyWalker を実行し、アプリの実行時に読み込まれた Visual Studio リストのライブラリと比較します。変わりはない。
  • SOをグーグルで検索しますが、これは上記のアイデアを思いついたか、F5とCtrl + F5の違いに対処しただけです(私の場合はありません)。

私はアイデアを使い果たしました。どこを見ればよいか、何を試してみるべきかについての指針に感謝します。

このアプリケーションは OpenGL と Qt を使用し、かなり普通のことを行います: DLL のロード/アンロードなし、開始時のファイル入力のみ (3D モデルとシェーダー)、ファイル出力なし、サードパーティのライブラリはほとんどありません (Qt を除いて、すべてが静的にリンクされています)。 .

けがに侮辱を加えるために、最近アプリの内部リファクタリングを行った後、私はこの動作を経験し始めました. それ以前は、VS の内外で問題なく動作していました。このリファクタリングには、主にいくつかの機能を新しく作成された基本クラスに抽出すること (つまり、A > B継承をA > C > B継承に変更し、関与する仮想呼び出しはほとんどありません) と、いくつかのnew[]呼び出しをstd::vectors に置き換えることが含まれていました。

編集

もう 1 つ試してみました。アプリのデバッグ プロパティで、ターゲットを に設定し、cmd /kCtrl+F5 を実行して を起動し、cmdそのコマンド ラインからアプリを実行しました。このようにして、通常の速度で実行されます (つまり、10 倍の速度低下はありません)。もちろんこれはデバッグには役に立ちませんが、完成度を考えて言及したいと思います。

編集2

私はそれを見つけました:それは作業ディレクトリへの奇妙な依存関係でした。.vcproj が存在するディレクトリ (VS は通常 F5 と Ctrl+F5 を使用) から開始すると、ディレクトリ内の相対パスが存在し、デバッグ出力 (存在を忘れていた) が成功し、実行が遅くなります。他のディレクトリから実行すると、出力が失敗し、実行が速くなりました。

これに時間を費やしたすべての人に謝罪します。クローズする投票。

4

1 に答える 1

3

私の経験から、これは低フラグメンテーションヒープに関連しています。しかし、あなたは_NO_DEBUG_HEAP = 1を設定したと言ったので、これが正しい答えかどうかはわかりません。少なくとも試してみることができると思います。

低フラグメンテーションヒープ(LFH)は、ヒープのフラグメンテーションを減らすのに役立ちます。有効にすると、アプリケーションが大量のメモリ割り当てを使用する場合に、アプリケーションのパフォーマンスを10倍に向上させることができます。

Windows Vista以降、LFHはデフォルトで有効になっていますが、LFHは無効になっています。プロセスを任意のデバッガーで実行すると、プロセス内のすべてのヒープに対して特定のヒープデバッグオプションが自動的に有効になります。これらのヒープデバッグオプションは、LFHの使用を防ぎます。

これは、VSから起動した場合にアプリケーションの実行が10倍遅くなる理由を説明しています(過去に同じ問題が発生しました)。関数HeapQueryInformationを使用してヒープ情報を取得し、それを出力して、LFHが無効になっていることが原因であるかどうかを確認できます。

LFHの詳細については、次の2つの記事を参照してください。

  1. 低フラグメンテーションヒープ
  2. HeapSetInformation関数

フォーラムでの同様の投稿の1つ:デバッガー/ IDEを接続していると、STLコードの実行が非常に遅くなるのはなぜですか?

于 2012-12-13T04:41:08.703 に答える