您至少在我熟悉的语言(C,Java,C#)中对为什么效率低下的解释是准确的,尽管我不同意执行大量字符串连接普遍存在。在C#代码,我的工作,有丰富的使用StringBuilder
,String.Format
等等这些都是记忆保存techiniques避免过度再分配。
因此,要回答您的问题,我们必须提出另一个问题: 如果串联字符串从来就不是真正的问题,为什么类会喜欢StringBuilder
并StringBuffer
存在?为什么甚至在初学者编程书籍和类中都包含此类的使用?为什么看似过早的优化建议如此突出?
如果大多数使用字符串连接的开发人员的答案完全基于经验,那么大多数人会说这永远不会有所作为,并且会避免使用此类工具,而采用“更具可读性”的方法for (int i=0; i<1000; i++) { strA += strB; }
。 但是他们从来没有测量过。
这个问题的真正答案可以在SO答案中找到,它揭示了在一个实例中,当连接50,000个字符串(取决于您的应用程序,这很常见)时,甚至很小的字符串,都可能导致性能提高1000倍。
如果性能从字面上根本不代表任何意义,则必须将其连接起来。但是我不同意使用替代方法(StringBuilder)困难或可读性差,因此这是一种合理的编程实践,不应调用“过早优化”防御。
更新:
我认为这可以归结为了解您的平台并遵循其最佳实践,而遗憾的是,这些最佳实践并不普遍。来自两种不同“现代语言”的两个示例:
- 在另一个SO答案中,在JavaScript中有时发现完全相反的性能特征(array.join vs + =)是正确的。在某些浏览器中,字符串连接似乎是自动优化的,而在其他情况下则不是。因此,建议(至少在该SO问题中)是串联而不用担心。
- 在另一种情况下,Java编译器可以用更有效的结构(例如StringBuilder)自动替换串联。但是,正如其他人指出的那样,这是不确定的,不能保证,并且使用StringBuilder不会损害可读性。在这种特殊情况下,我倾向于建议不要将串联用于大型集合,也不要依赖于不确定的Java编译器行为。同样,在.NET中,永远不会执行排序优化。
马上就不了解每个平台的每一个细微差别,这并不是一个主要的罪过,但是忽略这样的重要平台问题,几乎就像是从Java到C ++,而不是关心释放内存。