2009-04-08 33 views

答えて

14

測定 - 10Mコールは約50秒かかります。私はそれが未使用の機能にとって重大なオーバーヘッドだと思う。マクロを使用して

は、リリースビルドでは、このを取り除くのに役立ちます。

#ifdef _DEBUG 
    #define LOGMESSAGE(str) OutputDebugString(str); 
#else 
    #define LOGMESSAGE(str) 
#endif 

だけでなく、通話を削除するだけでなく、パラメータの評価およびテキスト文字列が完全に削除され、あなたがそれらを見ていますバイナリファイル

4

あなた自身で測定してみませんか?次のコードをコンパイルし、&を実行します。 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; 
    } 
+4

注意を。パフォーマンスは、デバッグ出力(DebugView、Visual Studioデバッガなど)を監視しているものによって大きく左右され、実行中のWindowsのバージョンによって異なるため、さまざまな状況でテストする必要があります。それは、自分の時間の3分以上を要するだろう。 –

+1

私は貧しい人の時間(NULL)を使用して上記のコードスニペットをテストしました。 OutputDebugStringをオンにすると、1000,000回に13秒かかりますが、出力をキャプチャするDbgViewerが開いている場合は、デバッガが接続されていません。時間は169秒です。 OutputDebugStringをオフにすると、測定時間は0秒になります。 – zhaorufei

8

私が内蔵されているすべてがメトリック年間で、サーバー側リリースモードのアプリの数十、問題を見ていませんでした。 の印象は、デバッグキャッチャーアプリケーション(DBWIN32など)のほとんどが画面上にデータを投げて遅れを感じるのでかなり遅いため遅くなることがあります。

もちろん、すべてのアプリケーションでこの出力がデフォルトで無効になっていますが、です。これはフィールドでオンにすると便利です.DBWin32のようなシリアル化された複数のアプリケーション。これは、アプリケーションの通信を伴うバグに対して非常に有用なデバッグ手法となります。

+0

+1はフィールドでオンにすると便利です_ –

9

私が行う内部でいくつか面白いことをOutputDebugStringの記事で読んでいた:

  1. は\作成ミューテックスを開き、ミューテックスが取得されるまで無限に待ちます。
  2. アプリケーションとデバッガの間のデータの受け渡しは、共有メモリの4キロバイトのチャンクを介して行われます。ミューテックスと2つのイベントオブジェクトは、アクセスを保護します。

デバッガがアタッチされていなくても(リリースモード)、OutputDebugstringをさまざまなカーネルオブジェクトの使用に使用するとかなりのコストがかかります。

サンプルコードを書いてテストすると、パフォーマンスが大幅に低下します。

6

リリースビルドでOutputDebugString()を呼び出さないでください。 #ifdefステートメントを使用してそれらを削除するか、別のスイッチを指定してスイッチをオフにしてください。

デフォルトの状態で無効にして、要求に応じて有効にしてください。そうしないと、他のアプリのデバッグが難しくなります(要求に応じて出力デバッグデータのみ)。

Theres DebugViewアプリの出力をキャッチすることはもちろんですが、すべてのアプリがあまりにも理由がないのであれば、それは良いことです。

10

私はこの質問が回答されているが、与えられた答えは、特定の側面を見逃してずっと後にこれを書いている:誰もがその出力を聞いていないとき

OutputDebugStringのは、非常に高速であることができます。しかし、リスナーをバックグラウンドで実行すること(DbgView、DBWin32、Visual Studioなど)は、10倍以上の速度を向上させることができます(MT環境ではるかに多く)。これらのリスナーがレポート・イベントをフックする理由は、OutputDebugStringコールのスコープ内でイベントの処理が行われるためです。さらに、複数のスレッドが同時にOutputDebugStringを呼び出すと、それらは同期されます。詳細については、Watch out: DebugView (OutputDebugString) & Performanceを参照してください。

私は、リアルタイムアプリケーションを実行していない限り、10Mコールを実行するのに50秒かかるという心配はありません。あなたのログに10Mのエントリが含まれている場合、無駄な50秒はあなたの問題の中で最も少なくなります。 10Kログははるかに合理的に聞こえ、作成するにはsharptoothの測定ごとに0.05秒しかかかりません。

あなたの出力が合理的なサイズの範囲内であれば、OutputDebugStringを使用してもそれほど傷ついてはいけません。しかし、システム上の誰かがこの出力を聞き始めると、減速が起こることを覚えておいてください。

2

私はこのトピックについて興味があったので、いくつかの研究を行いました。

セットアップのテストを繰り返すことができるように、結果、ソースコード、プロジェクトファイルを投稿しました。 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?

関連する問題