这可能听起来很愚蠢,但......
当我创建大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)";
它保持代码可读但保存连接。现在它真的保存了任何性能,或者编译器是否足够智能“预连接”第一个字符串?
答案 0 :(得分: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也足够聪明: - )
答案 1 :(得分:6)
是的,编译器将在编译时计算常数和字符串的arithemetical操作。但是,回答这样的性能问题的更好方法是自己尝试。拿出StopWatch类,双向编写代码,循环运行十亿次,然后你就会知道。