我知道这个问题已经被解决了,但是我有一个稍微不同的想法。一些人指出这是过早优化,如果我只是为了实用性而提问的话,这完全是正确的。我的问题根源于一个实际问题,但我仍然很好奇。
我正在创建一堆 SQL 语句来创建一个脚本(保存到磁盘),以便重新创建数据库架构(很容易有许多表,视图等)。这意味着我的字符串连接是仅追加的。根据 MSDN,StringBuilder 通过保持内部缓冲区(肯定是 char[])并将字符串字符复制到其中,并根据需要重新分配数组来工作。
然而,我的代码有很多重复的字符串("CREATE TABLE [","GO\n" 等),这意味着我可以利用它们 被池化,但如果使用 StringBuilder,则无法利用它们,因为每次都会复制它们。唯一的变量基本上是表名和其他已经存在于内存中的字符串形式的对象。
所以据我所知,在读取数据并创建保存模式信息的对象之后,所有的字符串信息都可以通过池化进行重用,对吗?
假设如此,那么 List 或 LinkedList 的字符串会更快,因为它们保留对池化字符串的指针?然后只需调用 String.Concat() 一次即可获得整个字符串的单个内存分配,该字符串的长度正好正确。
一个列表需要重新分配内存,而链表需要创建节点并修改指针,所以它们不是“自由的”,但如果我正在连接许多数千个国际化字符串,则它们似乎会更有效。
现在,我想我可以为每个SQL语句计算字符数,然后计算每种类型的字符数,并预设我的StringBuilder容量,以避免重新分配其char[],但我必须超额预留一定的余量来减少重新分配的概率。
因此,对于这种情况,哪种方法最快地获取一个单一的连接字符串:
- StringBuilder
- 已经国际化的字符串列表
- 已经国际化的字符串链表
- 带有容量启发式的StringBuilder
- 其他方法?