在有人质疑使用string.intern()
的事实之前,我先说一下,出于内存和性能的原因,我需要在特定的应用程序中使用它。 [1]
因此,到目前为止,我一直使用String.intern()
并假定它是最有效的方法。但是,自古以来我就注意到它是软件的瓶颈。 [2]
然后,就在最近,我试图用一个巨大的映射替换String.intern()
,在该映射中放置/获取字符串,以便每次获得唯一的实例。我以为这会慢一些...但是事实恰恰相反!它快得多了!通过推/轮询 map (实现完全相同)来替换intern()
可以使速度提高一个数量级。
问题是:为什么intern()
这么慢?那么为什么不简单地将其备份到 map (或者实际上只是一个自定义集合)中,却会大大加快速度?我很困惑
[1]:对于难以置信的用户:它是自然语言处理,并且必须处理千兆字节的文本,因此需要避免同一字符串的许多实例,以免消耗内存和参照字符串比较足够快。
[2]:没有它(普通字符串)是不可能的,有了它,这一特定步骤仍然是计算最密集的步骤
编辑:
由于对本文的兴趣出乎意料,这里有一些代码可以对其进行测试:
http://pastebin.com/4CD8ac69
实习超过一百万个字符串的结果:
HashMap
:4秒String.intern()
:54秒由于避免了一些预热/OS IO缓存和类似的操作,因此通过颠倒两个基准测试的顺序重复了该实验:
String.intern()
:69秒HashMap
:3秒如您所见,差异非常明显,超过十倍。 (使用OpenJDK 1.6.0_22 64位...但是使用sun会产生类似的结果)
最佳答案
性能差异的最可能原因:String.intern()
是 native 方法,调用 native 方法会产生大量开销。
那么为什么是 native 方法呢?可能是因为它使用了常量池,它是低级VM构造。
关于java - 为什么string.intern()这么慢?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7263399/