Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 值得为5个连接使用StringBuilder吗?_C#_Java - Fatal编程技术网

C# 值得为5个连接使用StringBuilder吗?

C# 值得为5个连接使用StringBuilder吗?,c#,java,C#,Java,可能重复: 相关/重复问题 尽可能简单地说,我有这个方法1: cmd2.CommandText = ("insert into " + TableName + " values (" + string.Join(",", insertvalues) + ");"); 我想知道如果我能做到以下几点,方法2是否会更快: StringBuilder sb2 = new StringBuilder(); sb2.Append("insert into "); sb2.Append(TableNa

可能重复:

相关/重复问题

尽可能简单地说,我有这个方法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();

使用
String.format

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

它更具可读性。

除此之外,在我看来,StringBuilder方法的外观和可读性更好。根据

的规定,在添加5到10个字符串后,StringBuilder确实优于字符串连接。对于小型程序,这将是一个


如果您想考虑这些类型的优化,那么最好对其进行测量,因为这还取决于连接的字符串的大小,除了数字或附录。

一个好的编译器应该为您进行优化-但是当您可以轻松找到时,请不要相信我的话

除非您是在一个紧密的循环中进行此操作,否则性能上的差异可能是微不足道的


当您可以使用绑定变量时,值的字符串连接通常是构造SQL语句的一种不好的方法。这允许数据库优化查询。使用bind可能比优化字符串构造有更大的不同,使用bind,您只需要在每个会话中构造一次字符串,而不是在每个查询中构造一次字符串。

您也可以尝试string.Format,我相信它在内部使用了StringBuilder,但增加了可读性

cmd2.CommandText = string.Format("insert into {0} values ({1});", TableName, string.Join(",", insertvalues));
(这是给C#)的)

来自:

Java语言提供了特殊的 支持字符串连接 运算符(+),用于转换 将其他对象转换为字符串。一串 连接是通过 StringBuffer类及其附加 方法


因此,编译器似乎正在代表您使用
StringBuffer

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

您的两个方法在性能上不会有差异,原因是您的字符串包含在一个表达式中,编译器将为该表达式创建一个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();
}
String s3=”“;
对于(int n=0;n<5;n++){
s3=新的StringBuilder(s3).append(getText(n)).append('=').append(n).append(“\n”).toString();
}
使用显式StringBuilder创建方法可以避免创建不必要的StringBuilder对象

对于简单的方法,您通常不必自己优化字符串串联,但在代码处于关键路径的情况下,或者在您被迫使用许多不同的字符串表达式来构建最终结果的情况下,知道引擎盖下发生了什么是一件好事,这样你就可以决定是否值得付出额外的努力


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

唯一知道的方法是测量并查看。然而,您会发现可能存在的任何差异都很小,以至于可以忽略。这里有一个非常“流行”的问题:几乎重复:这个字符串连接的速度将是实际运行命令速度的一小部分,因此您肯定优化了错误的东西。另外:不要像这样构建SQL语句,因为你将很容易受到SQL注入攻击:错误的方法!!!StringBuilder更快,因为StringBuffer是线程安全的!stringbuilder=not threadsafe=fast,stringbuffer=slowish,但速度足够快。使用完美的转义分析stringbuilder=stringbuffer.@Steve:所以IDNRRC。不需要大喊大叫;)为什么不编辑您的答案以使其正确?您确定%s?乍一看是被某人添加的java标记误导的;)现在我的解决方案是c#每当有人提到性能时,就无限期地重复这个早熟的优化论点,这在这里似乎很流行。为什么不鼓励人们尝试理解如何让他们的代码更快,以便在关键时刻,他们有更大范围的工具可供使用?因为这些人会一直使用这些工具,因为他们可能会更快,然后他们只会创建糟糕的代码,因为他们到处使用字符串生成器而不是字符串串联,但他们的应用程序性能仍然很差,因为他们没有优化真正的瓶颈,只是用StringBuilder temp=new StringBuilder()替换每个结果=string1+string2;临时附加(string1);临时附加(string2);结果=临时ToString();如果您想要可读性,那么使用格式肯定是一个不错的选择。此外,StringBuilder类有自己的方法AppendFormat,它使用相同的语法。我处理过用数百行Append编写的代码。这是一场噩梦,尽管至少很容易被重新考虑。AppendFormat和可重用助手函数的良好组合(优秀的程序员不会复制和粘贴)确实可以使它更易于管理。只是不要在单一格式中使用过多的参数。关键的考虑应该始终是可读性和可维护性。当然,Marcus。使用StringBuilder vs string.Format获得的任何性能改进都不会比试图从StringBuilder中计算出完整字符串的外观所花费的时间更大。始终考虑可读性和可维护性,而不是毫秒级性能改进