我想问一下人们在编写字符串方面的想法,以及构建字符串时性能是否存在巨大差异。
近年来我一直被告知永远不要做以下事情:
string dogName = "Ralph";
DateTime bornDate = DateTime.Parse("2010-01-01");
string fullText = "I am a Dog and my name is " + dogName + " and i was born on the " + bornDate.ToString("dd/MM/yyyy");
总是告诉他们类似的事情。
string dogName = "Ralph";
DateTime bornDate = DateTime.Parse("2010-01-01");
string fullText2 = String.Format("I am a Dog and my name is {0} and i was born on the {1:dd/MM/yyyy}", dogName, bornDate);
我看到使用后面的声明的原因,但是有人知道第一个声明存在什么类型的性能问题。
使用StringBuilder对象而不是使用
string str = "Adding this comment to the string\n"
str += "Then Add this line";
并使用以下内容:
StringBuilder sb = new StringBuilder();
sb.AppendLine("Add This Comment");
sb.AppendLine("Then add this comment");
string output = sb.ToString();
我的团队中有一些开发人员在工作中有点老派VB6程序员,我想向他们解释为什么这是一个坏主意。
他们不断为代码SQL语句执行初始代码示例。
如果是的话:):
答案 0 :(得分:6)
String或的串联操作的性能 StringBuilder对象取决于内存分配发生的频率。 字符串连接操作总是分配内存,而a StringBuilder连接操作只分配内存 StringBuilder对象缓冲区太小,无法容纳新数据。 因此,String类更适合串联 如果连接了固定数量的String对象,则进行操作。在 在这种情况下,单个连接操作甚至可能是 由编译器组合成单个操作。一个StringBuilder 如果是任意的,则对象优选用于连接操作 串联的数量;例如,如果一个循环 连接随机数量的用户输入字符串。
来源:http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.aspx
答案 1 :(得分:5)
当您构建一个需要大量连接的非常大的字符串时,StringBuilder实际上仅在性能意义上有用。对于您提供的小样本,我认为使用+运算符就可以了。
说到String.Format,我认为应该用它来提高代码的可读性或灵活性,但不是出于性能原因。 String.Format还具有支持本地化的额外好处,这在使用+运算符时并不容易。
在我遇到串联导致严重性能问题的经历中,我从未遇到过这样的情况,所以在尝试优化性能之前,我总是选择最易读的代码。
答案 2 :(得分:1)
我知道Java实际上使用StringBuffer(Java的StringBuilder版本)将一行中的+优化为一个语句,所以我猜C#可能会做同样的事情。因此它不应该真正有所作为。只有当一行是程序中执行次数最多的行时,才真正值得看一下差异(假设它存在)。
然而,当你使用+ =语句而不是使用StringBuildert构建整个页面时,差异非常明显;)我曾经重写了一个ASP.NET C#页面,它实际上都将(大)SQL查询构建为整个响应使用+ =而不是StringBuilders。我将加载时间从20秒降低到<1秒;所以是的,尽量避免使用+ =来构建字符串。