1

私はサードパーティのアウトソーシング会社から提供されたコードを確認していて、この小さな宝石に出くわしました。

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);
}

私の質問は、コンパイラがこれを完全に最適化するかどうかです。Reflectorでコンパイルされたアセンブリを見ると、次のように表示されます。

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

iの宣言はメソッドの先頭に移動され、Exceptionタイプの追加の宣言もメソッドの先頭にあります。

したがって、このコードは実際には何も実行しないので、コンパイラーがこのコードが何も実行せず、最適化できることを確認できるほど賢いのかどうか疑問に思いました。

4

3 に答える 3

13

したがって、Reflectorで見つけたように、C#コンパイラはそれを最適化しません。JITコンパイラがそうなるかどうかは別の問題です。しかし、答えはほぼ間違いなくそうではないと思います。

なんで?IndexOfJITコンパイラはそれが退屈な方法であることを知らないからです。言い換えれば、JITコンパイラが知る限り、次のstring.IndexOfように定義できます。

public int IndexOf()
{
   CallAWebService();
}

明らかに、その場合、その行を最適化することは悪いでしょう。

于 2010-12-02T17:25:07.600 に答える
6

IndexOfコンパイラは、それが副作用がなかったことをどのように知るのでしょうか?

つまり、基本的には、最適化することはできません。

于 2010-12-02T17:24:39.687 に答える
2

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

一方、それは非常に小さなオーバーヘッドです。string.IndexOf()のコストと比較して、catchブロックの設定はごくわずかです。

例外が発生した場合はコストがかかりますが、それはありそうにありません。

于 2010-12-02T17:44:52.897 に答える