リリースビルドでOutputDebugStringを呼び出すと、かなりのオーバーヘッドが発生しますか?リリースビルドでOutputDebugStringに関連付けられたオーバーヘッド
答えて
測定 - 10Mコールは約50秒かかります。私はそれが未使用の機能にとって重大なオーバーヘッドだと思う。マクロを使用して
は、リリースビルドでは、このを取り除くのに役立ちます。
#ifdef _DEBUG
#define LOGMESSAGE(str) OutputDebugString(str);
#else
#define LOGMESSAGE(str)
#endif
だけでなく、通話を削除するだけでなく、パラメータの評価およびテキスト文字列が完全に削除され、あなたがそれらを見ていますバイナリファイル
あなた自身で測定してみませんか?次のコードをコンパイルし、&を実行します。 OutputDebugStringへの呼び出しを削除し、再コンパイルして再実行します。あなたは3分の時間を取るべきです。
#include <windows.h>
int main() {
const int COUNT = 1000000;
int z = 0;
for (unsigned int i = 0; i < COUNT; i++) {
z += i;
OutputDebugString("foo");
}
return z;
}
私が内蔵されているすべてがメトリック年間で、サーバー側リリースモードのアプリの数十、問題を見ていませんでした。 の印象は、デバッグキャッチャーアプリケーション(DBWIN32など)のほとんどが画面上にデータを投げて遅れを感じるのでかなり遅いため遅くなることがあります。
もちろん、すべてのアプリケーションでこの出力がデフォルトで無効になっていますが、はです。これはフィールドでオンにすると便利です.DBWin32のようなシリアル化された複数のアプリケーション。これは、アプリケーションの通信を伴うバグに対して非常に有用なデバッグ手法となります。
+1はフィールドでオンにすると便利です_ –
私が行う内部でいくつか面白いことをOutputDebugStringの記事で読んでいた:
- は\作成ミューテックスを開き、ミューテックスが取得されるまで無限に待ちます。
- アプリケーションとデバッガの間のデータの受け渡しは、共有メモリの4キロバイトのチャンクを介して行われます。ミューテックスと2つのイベントオブジェクトは、アクセスを保護します。
デバッガがアタッチされていなくても(リリースモード)、OutputDebugstringをさまざまなカーネルオブジェクトの使用に使用するとかなりのコストがかかります。
サンプルコードを書いてテストすると、パフォーマンスが大幅に低下します。
リリースビルドでOutputDebugString()を呼び出さないでください。 #ifdefステートメントを使用してそれらを削除するか、別のスイッチを指定してスイッチをオフにしてください。
デフォルトの状態で無効にして、要求に応じて有効にしてください。そうしないと、他のアプリのデバッグが難しくなります(要求に応じて出力デバッグデータのみ)。
Theres DebugViewアプリの出力をキャッチすることはもちろんですが、すべてのアプリがあまりにも理由がないのであれば、それは良いことです。
私はこの質問が回答されているが、与えられた答えは、特定の側面を見逃してずっと後にこれを書いている:誰もがその出力を聞いていないとき
OutputDebugStringのは、非常に高速であることができます。しかし、リスナーをバックグラウンドで実行すること(DbgView、DBWin32、Visual Studioなど)は、10倍以上の速度を向上させることができます(MT環境ではるかに多く)。これらのリスナーがレポート・イベントをフックする理由は、OutputDebugStringコールのスコープ内でイベントの処理が行われるためです。さらに、複数のスレッドが同時にOutputDebugStringを呼び出すと、それらは同期されます。詳細については、Watch out: DebugView (OutputDebugString) & Performanceを参照してください。
私は、リアルタイムアプリケーションを実行していない限り、10Mコールを実行するのに50秒かかるという心配はありません。あなたのログに10Mのエントリが含まれている場合、無駄な50秒はあなたの問題の中で最も少なくなります。 10Kログははるかに合理的に聞こえ、作成するにはsharptoothの測定ごとに0.05秒しかかかりません。
あなたの出力が合理的なサイズの範囲内であれば、OutputDebugStringを使用してもそれほど傷ついてはいけません。しかし、システム上の誰かがこの出力を聞き始めると、減速が起こることを覚えておいてください。
私はこのトピックについて興味があったので、いくつかの研究を行いました。
セットアップのテストを繰り返すことができるように、結果、ソースコード、プロジェクトファイルを投稿しました。 OutputDebugStringを監視せずにリリースモードアプリケーションを実行し、Visual Studio 6、Visual Studio 2005、およびVisual Studio 2010でOutputDebugStringを監視して、各バージョンのVisual Studioのパフォーマンスの違いを確認します。
興味深い結果、Visual StudioのここでのVisual Studioよりも遅く6.
記事本文7倍した情報をアップOutputDebugStringを2010のプロセス:ちょうどこのコードを実行すると、全体の話ではありませんWhats the cost of OutputDebugString?
- 1. クラス対オブジェクトに関連付けられたJavascriptオーバーヘッド
- 2. メモリリークに関連付けられたUIView
- 3. 単一テーブル継承に関連付けられたHABTM関連
- 4. Enum関連付けられた値
- 5. 各URLに関連付けられた日付の抽出
- 6. IMarkerに関連付けられた注釈を見つける
- 7. Rails 4、has_many関連 - 関連付けられたオブジェクトを見つける
- 8. 関連付けられた値でenumをアーカイブするには?
- 9. SQL日付と関連付けられたデータとの結合
- 10. jsonキーに関連付けられた値にアクセスする
- 11. ユーザIDに関連付けられたドロップダウンリストに値を取得
- 12. 実行時にどのようなオーバーヘッドが拡張メソッドに関連付けられていますか? (.NET)
- 13. 子を関連付けられたキーで削除します。
- 14. 壊れた関連付けのレール4
- 15. ImageViewに関連付けられた画像を取得する
- 16. Gmaps4railsに関連付けられた画像を表示
- 17. ワークフローに関連付けられたリストアイテムを取得する
- 18. モデルに関連付けられたRailsメーラー
- 19. 別のコントローラに関連付けられたモデルを表示
- 20. タグに関連付けられたdockerFileを表示
- 21. FlexのDataGrid行に関連付けられたイベントハンドラ
- 22. 複数のエンティティに関連付けられた顧客クラス
- 23. エコーに関連付けられた行の値
- 24. NSURLRequestに関連付けられたNSURLConnectionを取得します。
- 25. Facebookのログインに関連付けられたユーザーログインログイン
- 26. 関連付けられたモデルによるExtJS 6グリッドグループ
- 27. スレッドに関連付けられたオブジェクトを取得するC#
- 28. 名前に関連付けられたオブジェクトを返します
- 29. 同じIPアドレスに関連付けられたWebサイト
- 30. エンティティフレームワークに関連付けられたオブジェクトをバインドする方法
注意を。パフォーマンスは、デバッグ出力(DebugView、Visual Studioデバッガなど)を監視しているものによって大きく左右され、実行中のWindowsのバージョンによって異なるため、さまざまな状況でテストする必要があります。それは、自分の時間の3分以上を要するだろう。 –
私は貧しい人の時間(NULL)を使用して上記のコードスニペットをテストしました。 OutputDebugStringをオンにすると、1000,000回に13秒かかりますが、出力をキャプチャするDbgViewerが開いている場合は、デバッガが接続されていません。時間は169秒です。 OutputDebugStringをオフにすると、測定時間は0秒になります。 – zhaorufei