2010-12-02 18 views
1

私は、サードパーティのアウトソーシング会社が私たちに与えられ、この小さな宝石に偶然出会ったいくつかのコードを見直しました:c#:このコードは最適化されますか?

try 
{ 
    int i = strOriginalData.IndexOf("\r\n"); 
    ////System.Diagnostics..EventLog.WriteEntry("i", i.ToString()); 
} 
catch (System.Exception ex) 
{ 
    ////System.Diagnostics..EventLog.WriteEntry("ex", ex.Message); 
} 

私の質問は、コンパイラは完全にこれを最適化するのですか?私はこの方法の一番上に移動したため

try 
{ 
    i = this.strOriginalData.IndexOf("\r\n"); 
} 
catch (Exception exception1) 
{ 
    ex = exception1; 
} 

宣言をし、Exception型の追加の宣言は、メソッドの一番上にある:私は反射でコンパイルアセンブリを見てみると、それはこのことを示しています。

このコードは実際に何もしないので、コンパイラがこのコードが何もせず、最適化できることを知るには十分にスマートなのかしらと思いました。

+0

コンパイラはそれを最適化しませんが、これらの種類のものはパフォーマンスの面で悪いことがあります。コードがスローされて食べられる状態になると、タイトなループのために徹底したperfノックオンが行われます。そして静かにもちろん... –

+0

@chiba:私はパフォーマンスの問題、正確性の問題の多くを考慮しませんでした。 –

+0

@Henk私はループを1時間に何百マイルも行くと思っている。例外を捕まえて嚥下する。これまで何度もやっていた "デバッグ"コードを見たことがないなら、私は言及しません。 –

答えて

13

Reflectorで見つけたように、C#コンパイラは、リフレクタで見つけたので、最適化しません。 JITコンパイラが別の質問かどうか。しかし、私は答えがほぼ確実ではないと思います。

なぜですか?なぜなら、JITコンパイラは、IndexOfが退屈な方法であることを知らないからです。言い換えれば、限りJITコンパイラが知っているように、string.IndexOf

明らか
public int IndexOf() 
{ 
    CallAWebService(); 
} 

として定義することができ、その場合には、その行を最適化することは悪いことでしょう。

6

IndexOfに副作用がないことをコンパイラーはどのように知っていますか?

基本的には、それを最適化するつもりはありません。

2

いいえ、最適化されません。

一方、非常に小さいオーバーヘッドです。 catchブロックを設定するstring.IndexOf()のコストと比較すると無視できます。

例外があった場合はコストがかかりますが、それはそうではありません。

関連する問題