代码之家  ›  专栏  ›  技术社区  ›  Alex from Jitbit

构造大字符串(例如SQL命令)C编译器有多聪明?

  •  6
  • Alex from Jitbit  · 技术社区  · 14 年前

    这听起来很愚蠢,但是。。。

    当我创建大型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)";
    

    它保持了代码的可读性,但保存了连接。现在它真的节省了任何性能,还是编译器足够聪明,可以“预连接”第一个字符串?

    2 回复  |  直到 14 年前
        1
  •  10
  •   Darin Dimitrov    14 年前

    是的,编译器足够聪明,可以优化常量字符串连接。为了证明这一点,让我们检查以下方法:

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

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

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

        2
  •  6
  •   Eric Lippert    14 年前

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