在有人质疑使用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/

    10-09 00:24