6

これはばかげているように聞こえるかもしれませんが...

大きな 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)";

コードを読みやすく保ちますが、連結を保存します。これで実際にパフォーマンスが節約されるのでしょうか、それともコンパイラは最初の文字列を「事前に連結」するのに十分なほどスマートなのでしょうか?

4

2 に答える 2

10

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

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 も十分にスマートです :-)

于 2010-03-06T10:59:44.233 に答える
6

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

于 2010-03-06T15:40:37.127 に答える