2009-06-18 8 views
1

MFCウィンドウ/ビュークラスのWindowProcオーバーライドでtry/catchを使用すると、パフォーマンスが低下します。それはなぜそうであり、代替は何ですか?WindowProcでtry/catchを使用するMFC

これは私がプロファイリングの結果として捉えたものです。ブロックを削除すると、関数の処理時間が大幅に短縮されます。私はMS VS 2008を使用しています。

答えて

1

usage-of-try-catch-blocks-in-c Todd Gardnerは、コンパイラが「テーブル」アプローチまたは「コード」アプローチを使用して例外を実装すると説明しています。 「コード」アプローチは、パフォーマンスヒットを説明します。

+0

私はMS VS 2008を使用していますが、どのアプローチを使用しているのですか? – vikash

+0

MSVCは両方を使用できます。あなたの測定値から、それはコード1を使用しているように見えます。 ISTRこれはx86-32コードに適用されます。 – MSalters

2

ちょうどtry/catchを使用するとパフォーマンスが低下しません。例外が多すぎますか?パフォーマンスヒットがどこから来たのかを知るためにコードをプロファイリングしましたか?

+0

非常に良い点。パフォーマンスのフットプリントはまったく異なるものである可能性があり、分析前にプロファイリングする方が優れています。 – sharptooth

0

あなたは、WindowProcがたくさんのトラフィックを処理していることを知っていると確信しています。 スイッチ(メッセージ)ループ外のコードは、ポンプを通過するすべてのメッセージによって実行されます。

私はちょうどWindowProcをオーバーライドし、呼び出された回数を単純にカウントする、小さなダイアログベースのMFCアプリケーションを作成しました。テストでは、ダイアログ上でマウスカーソルを動かすだけで、毎秒1000以上のWindowProc呼び出しが生成されることがわかりました。

ちょっと考えてください。

p.s.私はこれをコメントとして追加しましたが、まだ十分な評判スコアがありません。

+0

はい、windowprocは1000回以上数回呼び出されています。私はwindowproc内で発生した例外のtry/catchを持っています。ちょうどtry/catchを追加するとwindowprocの実行時間が増える – vikash

0

アプリクラスでは、CWinApp::ProcessWndProcExceptionをオーバーライドしてみてください。これにより、任意のコマンドまたはメッセージハンドラでキャッチされた未知のMFC CException(および派生物)にチャンスが与えられます。

あなたが最後の機会を必要とする場合は、あなた自身のSEHフィルターをインストールする必要があります。

+0

CWinApp :: ProcessWndProcExceptionは、MFC Expection(CExceptionとderivatives)でチャンスを取ることを可能にします.Thanks – vikash

1

代わりに、自分のコードの周りにtry-catchを置くことができます。あなたのWndProcへの呼び出しのほとんどは、C++例外をスローしないDefaultWindowProc *で終わります。したがって、try/catchを自分のコードに近づけると、オーバーヘッドが大幅に削減されます。

[*] DefaultWindowProcはスタックを拡張するなど、SEH例外をスローする可能性がありますが、それらを処理することはできません。

+0

答えはRopeの観察に影響を受けています。 – MSalters

関連する問題