可能重复:
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();
答案 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是更快的选择。