我知道这个问题has已被done但我有一个稍微不同的扭曲。有几位已经指出,这是过早的优化,如果我只是为了实用性和实用性的缘故而这是完全正确的。我的问题植根于实际问题,但我仍然很好奇。在C#中使用字符串连接的字符串连接
我创建了一堆SQL语句来创建一个脚本(如它将被保存到磁盘)来重新创建一个数据库模式(容易很多很多的数百个表,视图等)。这意味着我的字符串连接是仅附加的。根据MSDN,StringBuilder通过保留内部缓冲区(当然是char [])和将字符串复制到它中,根据需要重新分配数组来工作。但是,我的代码有很多重复字符串(“CREATE TABLE [”,“GO \ n”等),这意味着我可以利用它们的优势being interned,但如果我使用StringBuilder,因为它们会被复制,所以不能使用它们每一次。唯一的变量基本上是表名,并且这些变量已经作为已存在于内存中的其他对象中的字符串存在。
所以据我所知,我的数据读入后,我的对象创建了保存架构信息,然后我所有的字符串信息都可以通过实习来重用,是的?
假设,那么不会更快的List或LinkedList的字符串,因为它们保留指向interned字符串的指针?那么对于整个字符串的单个内存分配而言,只有一次调用String.Concat(),该分配恰好是正确的长度。
一个列表将不得不重新分配的String []实习指针和链表必须创建节点和修改指针,所以它们不是“免费”的事,但如果我串联成千上万的实习字符串,那么他们会觉得他们会更有效率。
现在,我想我能想出的字符计数启发式每个SQL语句&统计每个类型,并得到一个粗略的想法,并预先设定的我的StringBuilder的能力,以避免重新分配它的char [],但我不得不冲以公平的幅度减少重新分配的可能性。
因此,对于这种情况下,这将是最快的得到一个连接字符串:
- 的StringBuilder
- 列表<串实习串
- 的LinkedList <串>实习串>
- 具有容量启发式的StringBuilder
- 还有其他的东西吗?
作为单独的问题(我可能不会经常去盘)以上:将单一的StreamWriter输出文件更快了吗?或者,使用List或LinkedList,然后将它们从列表中写入文件,而不是先在内存中连接。
编辑: 根据要求,the reference(.NET 3.5)到MSDN。它说:“如果有空间可用,新数据被追加到缓冲区的末尾;否则,分配一个新的,更大的缓冲区,来自原始缓冲区的数据被复制到新缓冲区,然后新数据被追加到新缓冲区“。对我来说,这意味着一个char [],它可以让它变大(这需要将旧数据复制到调整大小的数组),然后追加。
这听起来像是不成熟的优化。是否需要比字符串生成器的性能更好? – kevindaub 2009-05-02 21:08:30
如果你正在编写一个程序来复制数据库模式,并且你正在研究字符串连接的性能,那么你应该重新考虑你的优先级。 – 2009-05-02 22:50:31
是啊,我不是新来的游戏,我明白过早的优化和优先事项(至少还有其他一些事情)。尽管如此,我并不是要求提供建议。 :)虽然这个问题根植于一个实际问题,但我并没有严格要求实用性。这就是说:你能回答这个问题吗? – 2009-05-02 23:21:48