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 
}

注意优化。因此,就性能而言,两种方法都是相同的。唯一的区别是,在第二种情况下,您将在字符串中获得新行 (\r\n),因此它们不会产生完全相同的字符串,但 SQL Server 也足够聪明:-)

于 2010-03-06T10:59:44.233 回答
6

是的,编译器将在编译时计算常数和字符串的算术运算。但是,回答此类性能问题的更好方法是自己尝试。拿出 StopWatch 类,双向编写代码,循环运行十亿次,然后你就知道了。

于 2010-03-06T15:40:37.127 回答