大きな文字列の構築(例: SQLコマンドの場合)C#コンパイラはどの程度スマートですか?

c# string-concatenation
大きな文字列の構築(例: SQLコマンドの場合)C#コンパイラはどの程度スマートですか?

これは愚かに聞こえるかもしれませんが…​

大きなSQLコマンドを作成するときは、コードを*読み取り可能な状態に*保ちたいので、次のようにします。

cmd.CommandText = "SELECT top 10 UserID, UserName " +
 "FROM Users " +
 "INNER JOIN SomeOtherTable ON xxxxx " +
 "WHERE UserID IN (blablabla)";

連結を参照してください? 今、パフォーマンスを節約するために、私は今これをします:

cmd.CommandText = @"SELECT top 10 UserID, UserName
     FROM Users
     INNER JOIN SomeOtherTable ON xxxxx
     WHERE UserID IN (blablabla)";

コードは読みやすくなりますが、連結は保存されます。 今、それは本当にパフォーマンスを節約しますか、コンパイラは最初の文字列を「事前連結」するのに十分スマートですか?

  6  0


ベストアンサー

はい。コンパイラは、定数文字列の連結を最適化するのに十分賢いです。 これを証明するために、次の方法を調べてみましょう。

public static string Concat()
{
    return "a" + "b";
}

リリースモードでコンパイルすると、次のILが生成されます。

.method public hidebysig static string Concat() cil managed
{
    .maxstack 8
    L_0000: ldstr "ab"
    L_0005: ret
}

最適化に注意してください。 したがって、パフォーマンスの点では、両方の方法は同じです。 唯一の違いは、2番目の場合、文字列に新しい行(\ r \ n)が含まれるため、まったく同じ文字列を生成しないことですが、SQL Serverも十分にスマートです:-)

10


はい、コンパイラはコンパイル時に定数と文字列の算術演算を計算します。 ただし、このようなパフォーマンスの質問に答えるより良い方法は、自分で試してみることです。 StopWatchクラスを取得し、両方の方法でコードを記述し、ループで10億回実行すると、わかります。

6


タイトルとURLをコピーしました