时间:2019-03-08 标签:c#stringbuilderperformance
c# stringbuilder performance
我有一个大约 50k 次迭代的 for 循环。
这样做效率更高吗:
Stringbuilder sb = new Stringbuilder();
for(int i = 0; i<50000; i++)
{
sb.Clear();
sb.Append("test") //Add everytime 9 different string even from parameters
string s = sb.ToString();
}
或者这样更高效:
for(int i = 0; i<50000; i++)
{
Stringbuilder sb = new Stringbuilder();
sb.Append("..."); //the same like above
string s = sb.ToString();
}
所以我的问题是:在每个循环中重新初始化 Stringbuilder 是更快还是使用 Stringbuilder.Clear()
函数更好?
或者在我的情况下,字符串中有 9 个不同的值更好地连接字符串?
此致!
第一种方法应该更高效,因为它(至少)减少了 2 倍
拨款。在任何情况下每次迭代都会分配一个 string
个实例,但不需要每次都实例化一个新的 StringBuilder
。
实际上,除非您手动指定初始容量(并指定足够大的容量),否则第二种方法每次迭代会分配更多的内存。否则 StringBuilder
可能必须分配几个额外的块(每次都将其容量加倍)。
由于调用 StringBuilder.Clear()
只是重置当前长度,已经分配的块不是 Clear()
trimmed/collected,所以下一次迭代将已经准备好缓冲区,并且 "probably" 大小合适。
我刚刚测试了你的代码:
- 第一个循环需要
1 ms
- 第二个循环需要
3 ms
我有一个大约 50k 次迭代的 for 循环。 这样做效率更高吗:
Stringbuilder sb = new Stringbuilder();
for(int i = 0; i<50000; i++)
{
sb.Clear();
sb.Append("test") //Add everytime 9 different string even from parameters
string s = sb.ToString();
}
或者这样更高效:
for(int i = 0; i<50000; i++)
{
Stringbuilder sb = new Stringbuilder();
sb.Append("..."); //the same like above
string s = sb.ToString();
}
所以我的问题是:在每个循环中重新初始化 Stringbuilder 是更快还是使用 Stringbuilder.Clear()
函数更好?
或者在我的情况下,字符串中有 9 个不同的值更好地连接字符串?
此致!
第一种方法应该更高效,因为它(至少)减少了 2 倍
拨款。在任何情况下每次迭代都会分配一个 string
个实例,但不需要每次都实例化一个新的 StringBuilder
。
实际上,除非您手动指定初始容量(并指定足够大的容量),否则第二种方法每次迭代会分配更多的内存。否则 StringBuilder
可能必须分配几个额外的块(每次都将其容量加倍)。
由于调用 StringBuilder.Clear()
只是重置当前长度,已经分配的块不是 Clear()
trimmed/collected,所以下一次迭代将已经准备好缓冲区,并且 "probably" 大小合适。
我刚刚测试了你的代码:
- 第一个循环需要
1 ms
- 第二个循环需要
3 ms