当前位置: 首页 > 面试题库 >

为什么string.intern()这么慢?

曾皓
2023-03-14
问题内容

在有人质疑使用的事实之前string.intern(),我先说一下,出于内存和性能的原因,我需要在特定的应用程序中使用它。[1]

因此,到目前为止,我一直使用String.intern()并假定这是最有效的方法。但是,自古以来我就注意到它是软件的瓶颈。[2]

然后,就在最近,我试图String.intern()用一个巨大的映射替换,在该映射中放置/获取字符串,以便每次获得唯一的实例。我以为这会慢一些…但是事实恰恰相反!它快得多了!intern()通过推送/轮询地图(实现完全相同)来替换,可以使速度提高一个数量级。

问题是:为什么intern()这么慢?那么为什么不简单地将其备份到地图(或者实际上只是一个自定义集合)中,却会大大加快速度?我很困惑

[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()是本机方法,调用本机方法会产生大量开销。

那么为什么它是本机方法呢?可能是因为它使用了常量池,这是一种低级VM构造。



 类似资料:
  • 让这种方法本土化背后的逻辑是什么? 与仅使用哈希图制作内嵌字符串池相比,有什么优势? 它看起来有点奇怪,但在非本机代码中似乎很容易做到: 那么为什么是本机代码呢?

  • 问题内容: 这是所有编程语言所共有的吗?在进行多次打印后再执行println似乎更快,但是将所有内容移动到字符串中并仅进行打印似乎最快。为什么? 编辑:例如,Java可以在不到一秒钟的时间内找到所有高达100万的质数- 但要进行打印,然后在自己的println中将它们全部输出可能需要几分钟!最多可打印100亿小时! 例如: 问题答案: 速度并不慢,而是由主机操作系统提供的与控制台连接的基础。 您可

  • 问题内容: 我对此感到困惑 现在让我们来看看numpy: 神圣的CPU周期蝙蝠侠! 使用改进,但恕我直言仍然不够 numpy.version.version =‘1.5.1’ 如果您想知道在第一个示例中是否跳过了列表创建以进行优化,则不是: 问题答案: Numpy已针对大量数据进行了优化。给它一个很小的3长度数组,毫不奇怪,它的性能很差。 考虑单独的测试 输出是 似乎是数组的归零一直花费在nump

  • 问题内容: Magento通常这么慢吗? 这是我的第一次使用体验,管理面板只需花一些时间即可加载和保存更改。这是带有测试数据的默认安装。 托管该服务器的服务器可超快地服务于其他非Magento站点。Magento使它如此缓慢的PHP代码有什么用,该如何解决? 问题答案: 我只是切身参与优化Magento的性能,但这是系统速度如此缓慢的一些原因 Magento的某些部分使用在MySQL之上实现的EA

  • 问题内容: IDLE是我最喜欢的Python编辑器。它提供了非常漂亮和直观的Python shell,它对单元测试和调试非常有用,并且还提供了一个简洁的调试器。 但是,在IDLE下执行的代码异常缓慢。 疯狂是指慢 三个数量级 : 重击 需要0.052秒, 闲 需要: 大约慢了2000倍。 有什么想法或想法可以改善这一点吗?我想这与后台调试器有关,但是我不确定。 亚当 问题答案: 问题是文本输出而不

  • ChatGPT为什么这么火?