中規模のネイティブ 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::vector
s に置き換えることが含まれていました。
編集
もう 1 つ試してみました。アプリのデバッグ プロパティで、ターゲットを に設定し、cmd /k
Ctrl+F5 を実行して を起動し、cmd
そのコマンド ラインからアプリを実行しました。このようにして、通常の速度で実行されます (つまり、10 倍の速度低下はありません)。もちろんこれはデバッグには役に立ちませんが、完成度を考えて言及したいと思います。
編集2
私はそれを見つけました:それは作業ディレクトリへの奇妙な依存関係でした。.vcproj が存在するディレクトリ (VS は通常 F5 と Ctrl+F5 を使用) から開始すると、ディレクトリ内の相対パスが存在し、デバッグ出力 (存在を忘れていた) が成功し、実行が遅くなります。他のディレクトリから実行すると、出力が失敗し、実行が速くなりました。
これに時間を費やしたすべての人に謝罪します。クローズする投票。