性能への配慮のための例外を投げ
-
08-06-2019 - |
質問
いにより以下のようなレスポンスコードが多く、時代だが、その実践から性能の視点ではない:
try
{
... // some code
}
catch (Exception ex)
{
... // Do something
throw new CustomException(ex);
}
基本的には何のメリカ-サンフランシスコ行っているかを網羅した例外をカスタム例外を投げる。
これこそが、異なる業績は以下の二つの:
try
{
... // some code
}
catch (Exception ex)
{
.. // Do something
throw ex;
}
または
try
{
... // some code
}
catch (Exception ex)
{
.. // Do something
throw;
}
は別として、アメリカの自動車の駆動系(パワートレインまたは符号化のベスト実践の引数にありがとうござい性能の差を3組?
解決
@ブラッド-Tutterow
例外的には紛失の場合はそのいずれに渡されたコンストラクタです。またいのが、第二のアプローチは非常に悪いことで、損失のスタックトレース.きます。純つかってし多くの場合その他のプログラマかったことが悔しかったな時のための真の原因の例外だけでrethrownシカケとエサを組み合わせて、tryブロックがあるも分からないのが問題のとします。
また第二のブラッド-コメントがなんか気に。このようなミクロの最適化では、恐ろしいアイデアです。ない例外をスローすべての繰り返し処理のためのループが稼働する長時間まで以上となっていない可能性が走る性能問題を例外です。
常に性能を最適化できたリモート保守業務などを示すのに必要な性能を最適化し、その後のスポットがあると証明され、回数です。
こちらの方がよくて読みやコードやデバッグ能力(IEが潜むことのないように、スタックトレースすることにより、ものをつくり走るナノ秒になります。
最終的に注包装の例外にカスタム例外...することが可能で有用な構築を中心と模索している。ご毎知られる合理的な例外的な場合がベースカスタム例外(またはからいベースの例外でしたので、そのUIできるだけで追このベースです。がで獲れた、例外を提供する必要がありますので情報を表示、ユーザーと言うReadableMessage物件の違いによるものなのか、それともされるようになっています。このように、当時のUI改例外すのは、このバグだを固定する必要があり、いつでも拾っていること例外で知られるエラー条件ることができ、扱われるべきであることによって適切にポートします。
他のヒント
もちろん負の数の新しいオブジェクト(例外)となりますので、よろしけどをすべてのコードする追加のプログラムが必要かどうかを判断するためには、よりよい分類の例外を払った。
としてのアドバイスを作ることを決定いる場合、新たなオブジェクトにない運搬に関する情報の例外したときに忘れて新しい例外をスローしました。
しかし、その他の状況では、階層の例外は非常に便利な、ユーザーの習します。かんの実施のファサードパターンは、これまでに考えるシナリオでは:
- が良くないことを取り上げていただきたく、毎の例外として、例外オブジェクトがいな(しょう)の貴重な情報
- が良くないものを各種のオブジェクトにキャッチしてください。がこんなの作成、ファサード
この仮説の場合には、より良いについては、作成した階層の例外クラスは、抽出ユーザーからの内なる複雑なシステムできるかについて何かのような例外を作成した。
として注
私は個人的には嫌い、使用の例外(階層の派生クラスの例外クラスを実施するための論理です。のような場合:
try {
// something that will raise an exception almost half the time
} catch( InsufficientFunds e) {
// Inform the customer is broke
} catch( UnknownAccount e ) {
// Ask for a new account number
}
のようにデイヴィッドはないかと思うのを行います。では低く過ごす為の時間を気にしですか?もあると思うがはるかに大きな問題より性能の心配は一切無用でした。
FxCop常に推奨して第三のアプローチのように、元のスタックトレースは失われます。
編集:削除されるものただの間違いやマイクな点です。
ん:
try
{
// some code
}
catch (Exception ex) { throw ex; }
とこくのスタックトレース.
代わりに:
try
{
// some code
}
catch (Exception ex) { throw; }
のスローなだけを例外に変数についての内部の例外の新しいカスタム例外です。
としての人に、最高性能の底てどうするかrethrowing既存のオブジェクトです。中には少なくとも正しいのでloosesのスタックです。
私が個人的に利用したカスタム例外したい場合は切り離し特定の依存関係コードです。例えば、方法の負荷データXMLファイルとなります。ここで間違った多くの動かし方が異なります。
かなり失敗するかもしれませんから読み込むディスク(FileIOException)は、ユーザーがアクセスでどこからかがいません(SecurityException)のファイルが破損(XmlParseException)、データを入れると、形式が間違っています(DeserialisationException).
この場合には、そのや、呼び出し側のクラスを作り、これらすべての例外rethrow単一のカスタム例外(FileOperationExceptionうと、呼び出し側が要らない参照です。IOまたはSystem.Xmlでもアクセスには何のエラーが発生してenumおよび他の重要な情報です。
記載のないミクロの最適化も、このような行為の例外では遅いことが発生します。最高の改善はみを避ける例外です。
public bool Load(string filepath)
{
if (File.Exists(filepath)) //Avoid throwing by checking state
{
//Wrap anyways in case something changes between check and operation
try { .... }
catch (IOException ioFault) { .... }
catch (OtherException otherFault) { .... }
return true; //Inform caller of success
}
else { return false; } //Inform caller of failure due to state
}
の投最初の例では、オーバーヘッドの創製の新しいCustomExceptionオブジェクトです。
再投第二の例では、例外をスローするタイプです。
再投つ目の例では、例外をスローするのと同じタイプがスローされる"一することが可能になっている。
での事例が少ない資源です。
お待ち....なぜ気性能の場合、例外がスローされます?していかなければい例外の一環として通常のアプリケーションの流れ(WAYYYYに対し最高の実践).
今しか見られない性能要件に関しては成功だって。
からの純粋な性能がスタンドポイントいらっしゃるかと思いる第三の場合はperformant.他の二つを抽出する必要があり、スタックトレースを構築し、新たなオブジェクトの潜在的にかなり時間がかかります。
とはいえこれら三つのブロックコード 非常に 異なる外行動で比較してはるかどうかのQuickSort効率は追加項目に赤-黒ツリーです。このとして、今でもよく行われているを選択し、適切ないことだと思います。