值得拥有一个StringBuilder进行5次连接?

时间:2010-02-12 09:16:03

标签: c# java

  

可能重复:
  At what point does using a StringBuilder become insignificant or an overhead?

相关/重复问题
String vs StringBuilder
At what point does using a StringBuilder become insignificant or an overhead?

尽可能简单,我有方法1

cmd2.CommandText = ("insert into " + TableName + " values (" + string.Join(",", insertvalues) + ");");

我想知道如果我愿意,方法2 会更快:

StringBuilder sb2 = new StringBuilder();
sb2.Append("insert into ");
sb2.Append(TableName);
sb2.Append(" values (");
sb2.Append(string.Join(",", insertvalues));
sb2.Append(");");

cmd2.CommandText = sb2.ToString();

8 个答案:

答案 0 :(得分:12)

您也可以尝试使用String.Format,我相信它在内部使用了StringBuilder,但可读性更高。

cmd2.CommandText = string.Format("insert into {0} values ({1});", TableName, string.Join(",", insertvalues));

(这是针对C#)

答案 1 :(得分:3)

对于小型程序,这将是 premature optimization

如果你想考虑这些类型的优化,那就更好地衡量它,因为这取决于连接的字符串的大小,除了数字或附加。

答案 2 :(得分:2)

除了IMO之外,StringBuilder方法的外观和读取效果更好,根据http://dotnetperls.com/stringbuilder-performance

,在5到10个添加的字符串后,StringBuilder的性能优于字符串连接

答案 3 :(得分:2)

来自here

  

Java语言提供了特殊功能   支持字符串连接   运算符(+),以及转换   其他对象到字符串。串   连接是通过实现的   StringBuffer类及其追加   方法

因此,无论如何,编译器似乎都在使用StringBuffer

答案 4 :(得分:2)

在C#中,"a" + b + "c"形式的表达式由编译器优化为String.Concat("a", b, "c"),因此您不会获得中间字符串。这比StringBuilder更有效。

答案 5 :(得分:1)

一个优秀的编译器应该为您优化这一点 - 但是当您可以轻松找到它时,请不要相信我的。

除非你在紧密循环中这样做,否则性能上的差异可能是微不足道的。

当您可以使用绑定变量时,字符串串联值通常是构造SQL语句的不良方法。这允许数据库优化查询。使用bind可能会比优化字符串构造产生更大的差异 - 使用bind,您只需要为每个会话构造一次字符串,而不是每次查询一次。

答案 6 :(得分:0)

使用String.format

String.format("insert into {0} values({1});",TableName,string.Join(",", insertvalues));

它更具可读性。

答案 7 :(得分:0)

您的两种方法在性能上没有区别,原因是您的字符串在1个表达式中连接,编译器将为该表达式创建一个StringBuilder。以下是等效的,并产生相同的代码:

String s1 = "five" + '=' + 5;

String s2 = new StringBuilder().append("five").append('=').append(5).toString();

如果您的代码拆分表达式,例如在循环中,创建自己的StringBuilder将会表现得更好,使用字符串+连接结果的天真版本会在代码编译后生成:

String s3 = "";

for (int n = 0; n < 5; n++) {

    s3 = new StringBuilder(s3).append(getText(n)).append('=').append(n).append("\n").toString();
}

使用显式StringBuilder创建方法可以节省不必要的StringBuilder对象的创建。

对于简单方法,您通常不必自己优化字符串连接,但是在代码位于关键路径上的情况下,或者您被迫使用许多不同的字符串表达式来构建最终结果的情况下,它是很高兴知道幕后发生了什么,这样你就可以决定是否值得付出额外的努力。

请注意,StringBuffer是线程安全的,而StringBuilder则不是。对于多线程访问不是问题的情况,StringBuilder是更快的选择。