2012-03-26 144 views
2

为什么做得如此糟糕?为什么val + = someOtherValue如此糟糕?

String val = null; 
String someOtherValue = "hello" 

val += someOtherValue; 

它一定很坏,但为什么呢?我的程序中有这条线,它极大地减缓了一切!

我假设这是因为它不断重新创建字符串?这是唯一的原因吗?

+0

“非常”多少?你执行过多少次(循环)?如果您不*附加'someOtherValue',您的程序是否会有不同的操作? – 2012-03-26 04:19:23

+0

你是如何确定它是唯一会减慢程序速度的东西? – krammer 2012-03-26 04:20:24

+0

到一切都冻结了!我正在解析图像中的值,因此对于图像中的每个像素(3个字节大),我追加了一个单独的值。我追加的值的大小是每次1字节大...我改为使用列表,现在它不冻结。 – BigBug 2012-03-26 04:21:41

回答

8

确切的代码非常好;编译器会优化它。

这样做在循环可能会很慢,因为这会为每个级联创建一个单独的(不可变的)string对象。

改为使用StringBuilder

+0

使用StringBuilder还是使用字符串列表更好?为什么? – BigBug 2012-03-26 04:23:04

+0

@BlueMonster:没关系。如果您正确设置容量(以避免调整大小),StringBuilder应该更快一点 – SLaks 2012-03-26 04:32:32

3

是的,原因是字符串在C#中是不可变的,这意味着它们不能被改变。该框架被强制每次你做一次分配一个新的字符串+ = 尝试使用StringBuilder的,而不是..

所不同的是在长期循环非常明显

+0

使用StringBuilder还是使用字符串列表更好?为什么? – BigBug 2012-03-26 04:22:55

+1

请注意,如果使用简单concat(s1 + s2)少于7次,它仍然更便宜。 – SimpleVar 2012-03-26 04:22:55

+0

@BlueMonster string.Join(“”,strs)比SB好,但不是太多。对它进行测试相当简单。 – SimpleVar 2012-03-26 04:23:54

1

我不认为有一个银色子弹“这比这更好”。这取决于您需要连接字符串的场景。性能与可读性在这里也是一个问题。有时候最好通过在性能上做一些妥协来编写一个可读性很好的代码。

参照的article从詹姆斯迈克尔野兔

的事实,则concattenation运算符(+)已被用于 速度优化,并看起来干净在接合在一起一组已知 串最简单的方式。

另一方面,StringBuilder在您需要构建 字符串的不确定长度时很出色。当你在 循环时,使用它,直到你达到停止条件,并建立一个结果,它不会误导你。

String.Format似乎是从统计数据中松散,但考虑 其中哪些更可读。是的,忽略这样一个事实,即您可以使用DateStyle上的ToString()来执行此操作。

看一看article,值得一看。

+0

谢谢,这个答案真的帮助:) – BigBug 2012-03-26 06:52:32