为什么不使用字符串缓冲区而是使用不可变的字符串?

3

越来越多的编译器使用不可变字符串(因为字符串池,但还有其他原因吗?)。然而,当连接字符串时,字符串缓冲区要快得多。是否有任何理由,使得不是所有的编译器都内部使用字符串缓冲区,而不是不可变字符串?


决定创建不可变对象的目标是为了更好地控制(如果T是13,则永远不会是14),这是编写高质量代码的有利因素。提高语言的优雅程度。一些地方需要更好的性能,因此需要使用StringBuilders等。顺便说一句,不可变性对速度也有积极影响:具有侵略性的编译器,高线程安全等。 - Jacek Cz
换句话说:不可变性的发明并不是因为没有其他方式,而是像面向对象编程领域中的有意识的项目一样。 - Jacek Cz
1个回答

1
可能最大的不可变性争议在于它对并发的好处。如果您知道对象永远不会更改,则无需锁定和保护该对象。随着我们的多核处理器中心增加,这种好处变得越来越令人信服。
当然,也存在权衡。正如您所提到的,字符串缓冲区可以在应用程序中执行大量字符串操作时优于新字符串的常量分配。幸运的是,大多数语言都包含一个隐藏在库中的字符串缓冲区。默认情况下,不可变字符串更安全。在某些情况下,它们更快。如果您发现它们不适合您,您总可以换成缓冲区。

嗨,谢谢你的回答!您是否知道任何基准测试可测试不可变字符串与字符串缓冲区,以及不可变字符串的胜利?或者您能否给出如何构建这样一个基准测试的任何提示? - Olle Härstedt
考虑空间:如果字符串一遍又一遍地重复出现,不可变字符串可能会使用更少的空间。每个缓冲区都将包含一个副本,而(根据实现)只有一个内部化的不可变字符串。时间:不可变性意味着您可以缓存字符串操作的结果。这是安全的,因为源不会改变。想象一下在字符串中搜索并缓存结果。我不是说这很常见,但它是可以做到的。此外,重度多线程可能需要更多时间来处理缓冲区(协调访问)。与所有基准测试一样,您可以找到一个场景,在该场景中缓冲区的表现更好。 - Corbin March
我的问题是我找不到一个缓冲区表现不如其他方式的基准测试。我会继续寻找。 - Olle Härstedt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接