gpt4 book ai didi

java - new string(byte[]) 在多线程应用程序中太慢

转载 作者:搜寻专家 更新时间:2023-11-01 02:36:23 24 4
gpt4 key购买 nike

我注意到当我从单个线程调用 new String(byte[]) 时,速度非常快。但是当我从几个不同的线程调用它时,它变得非常慢。

例如,我有一个调用new String(bytes) 的解析器。如果我按顺序调用解析器 50 次,每次解析大约需要 100 毫秒,但如果我创建 50 个线程并调用解析器,则每次解析需要 12000 毫秒到 21000 毫秒! (在后面的线程中它变得更慢)。似乎 String(bytes) 构造被定义为同步。

探查器将瓶颈追踪到 new String(bytes) 并且确实当我将其更改为 new String("Hello") 时,解析器在多线程中变得一样快线程就像在单线程中一样。

有人知道为什么会这样吗?解决方法是什么?

更新:我的验证测试是错误的,因为显然 Java 编译器有一些内部优化,当我调用 new String("Hello") 时共享 String 对象而不是创建新对象。所以这就是为什么我进行更改时速度更快的原因。我将重写我的测试代码并更新这个问题。

答案:下面的@nafas 和@peter 答案都是正确的。 String 本身并不慢,但分析器错误地将它们识别为瓶颈。真正的罪魁祸首是:

  1. 拥有比可用内核更多的线程。
  2. 垃圾收集器在操作中间暂停执行,因为创建和销毁了太多的临时对象。

最佳答案

交换

如果 RAM 不足,JVM 会连同操作系统一起切换到 HDD。增加可用的 Xmx 和 Xms 以获得更好的性能。

关于java - new string(byte[]) 在多线程应用程序中太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50103334/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com