2009-08-28 8 views
7

C#でリアルタイムプログラミングを実際に行っている人や、実際にその言語の内部を理解している人の回答が必要です。C#Real Time Try Catch

私は、通常の処理を処理するために例外を使用すべきではなく、エラー条件を検出するためにのみ使用するべきであることを知ります。その話題について多くの議論があります。

単純にtry/catchブロックを置いている(プログラムがとにかく終了しなければ例外を捕まえない)から実行時間が遅いかどうかを知りたいです。 try/catchブロックは、繰り返し呼び出さなければならない関数の中にあります。最低限のコストしかないと思う。

CPUサイクルや他のタスク(浮動小数点の乗算と同じコスト)などでコストを定量化できますか?

Windows XPではMicrosoft C#.Net 3.5を使用しています。

+1

例外やパフォーマンス上のジョンスキートのリソースを見てみましょう:あなたがアクセスするまでhttp://www.yoda.arachsys.com/csharp/exceptions.html –

答えて

10

例外がスローされない限り、.NET例外には非常に非常に低いオーバーヘッドコストが発生します。 try/catchブロックを適切に配置することで、パフォーマンスへの影響はごくわずかです。非常に速くタイトなループでも、例外処理を行うことにほとんど影響がないことがわかりました。

しかし、.NETの例外は投げられると非常に高価です。あなたが他の言語よりも多くの言語を投げていると、パフォーマンスに大きな影響を与える傾向があります。これは、例外が作成されたときに収集されたスタック情報の完全なものです。

これは、例外処理のコストが高くなりますが、投げは実際にかなり効率的です。

しかし、あなたが懸念している場合は、ルーチンをプロファイルし、自分でテストすることをお勧めします。これはかなりのパフォーマンスプロファイリングの後、私の経験でした。独自のコードベースでの測定の代用はありません。

+0

実際には、スタックトレースは発生しません。 StackTraceプロパティ、または例外がプロセスの境界(つまり、remoting/wcf/etc)を渡す場合例外がいくつかのプロパティを設定するだけなので、例外を作成することは非常に低コストです。 StackTraceが要求されたときにスタッククロールを容易にするスロープロセス設定StackCrawlMarksによって適度なコストが発生しますが、.NET 2.0では実際にアクセスしない限りスローされません。 – jrista

+0

はい - 私は実際にスタックマーキングのメカニズムを指していましたが、私の答えははっきりしていませんでした。しかし、私のプロファイリングでは、かなりのオーバーヘッドがあります(これは、重要なシステムだと仮定しています)。 Rico Marianiには理由が説明されていますが、私にとって問題は余分なキャッシュミスやページ違反です:http://blogs.msdn.com/ricom/archive/2006/09/25/771142.aspx –

+0

その情報のために。残念ながら、コードをプロファイリングするツールはありません...ベストプラクティスに従わなければなりません。 –