gpt4 book ai didi

java - 使用谓词过滤并发映射或列表(使用并行流)更快吗?

转载 作者:行者123 更新时间:2023-11-30 08:18:56 24 4
gpt4 key购买 nike

我有多个FileMap存储在 List<FileMap> 中的对象,目前约有 500,000 个对象。

我正在使用谓词来使用并行流过滤列表。我现在正在阅读文档,看到有一个名为 Collectors.toConcurrentMap() 的函数。我熟悉ConcurrentHashMap并且知道它更快,因为多个线程划分映射。

将更改简单ArrayListtoConcurrentMap然后将谓词与并行流一起使用会更快吗?目前,如果我在该列表上使用并行流并使用串行流,它的工作速度相同。

最佳答案

Map 是键值对的集合,其中键是唯一的。您拥有的数据不是 map ,而是列表。问题有很多:

  1. 尝试将列表转换为映射需要提供键和值映射函数。
  2. 您最终会得到比原来更大的结构。
  3. 您必须确保键映射函数返回唯一的值,从而使并行化变得不可能(您可以使用同步,但它会大大降低性能)。
  4. map 是比列表(实际上是一个数组)更复杂的结构,并且构建它需要更多时间。
  5. ConcurrentMap 具有额外的复杂性来确保线程安全 - 尽管它是以比仅使所有方法同步更智能的方式完成的,但它仍然会影响性能。
  6. 迭代 map 与数据的存储方式没有太大关系 - 无论如何,您都需要获取一个值集。

过滤列表元素可以高度(且轻松)并行化。拥有 n 个核心,其中 n 是列表的长度,您可以获得与 log(n) 一样好的性能 - 这是当然的使用专门的并行算法并使用显卡代替 CPU,因为这些算法虽然功能较弱,但具有数千个内核。

我在一个包含 1 亿个整数的列表上运行了一些测试,并在尝试将列表转换为 时使用并行流顺序处理它大约需要 700 毫秒 - 大约 350 毫秒(我猜 Java 仅使用了 2 个线程)几分钟后,ConcurrentMap 抛出内存不足错误。

您提到使用 stream()parallelStream() 不会改变性能。我建议研究 Java 如何选择在并行流中使用多少个线程(以及如何更改)。这也受到您的资源的影响 - 运行比 CPU 中的核心数量更多的 CPU 消耗线程会因上下文切换而降低性能。我建议仅使用与您拥有的核心数量一样多的线程或少一个线程 - 这样一个核心就可以用于所有其他操作系统工作。

关于java - 使用谓词过滤并发映射或列表(使用并行流)更快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29242181/

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