Java 8 API 是否使用新的 Java 流 API 内部实现集合?
Is Java 8 API internal implementation of collections using the new Java Stream API?
Java 8 Stream API 允许在执行代码时使用 implicit 并行化。我无法在任何地方找到 Java 8 中集合(例如 HashSet 和 HashMap)的内部实现是否正在使用这些。关键是,如果是的话,那么使用这些集合的单线程代码将(在内部)执行多线程,从而可能显着提高性能。
我们有一个单线程程序,当它在 JVM 中执行时,JVM 使用 100%(或大约那么多)的 8 个内核。我们想知道为什么以及为了什么目的以及是否可以控制它。在 JVM 中并行执行的情况下,用于计算的有效 CPU 时间量可能会更低。因此,如果 A) 我们仅通过 运行 8 个单线程程序(也作为单线程执行)同时使用 8 个内核而不是 B) 为单个程序提供 8 个内核,我们可能会做得更好。
至少出于以下原因,现有功能不会突然从顺序执行变为并行执行:
- 传递给例程的函数或回调可能不准备同时调用
- 在 CPU 个核心之间仔细执行负载平衡的应用程序会发现自己突然做得很糟糕,因为假设 运行 在一个核心上的代码只使用了比预期更多的核心
- 即使应用程序不会使用 CPU 核心,库也无法预测应用程序的问题是否会真正受益于并行处理,即给定要处理的元素数量和处理单个元素的实际成本
您可能会注意到新的 API 明确允许并行处理,例如 Arrays
utility class 现在除了 sort
之外还提供 parallelSort
,等等
进一步注意 Stream API 也不允许 implicit 并行化,您必须请求并行流 explicitly , 使用 Collection.parallelStream()
或 Stream.parallel()
或使用 true
作为 StreamSupport
.
中工厂方法的 parallel
参数
Java 8 Stream API 允许在执行代码时使用 implicit 并行化。我无法在任何地方找到 Java 8 中集合(例如 HashSet 和 HashMap)的内部实现是否正在使用这些。关键是,如果是的话,那么使用这些集合的单线程代码将(在内部)执行多线程,从而可能显着提高性能。
我们有一个单线程程序,当它在 JVM 中执行时,JVM 使用 100%(或大约那么多)的 8 个内核。我们想知道为什么以及为了什么目的以及是否可以控制它。在 JVM 中并行执行的情况下,用于计算的有效 CPU 时间量可能会更低。因此,如果 A) 我们仅通过 运行 8 个单线程程序(也作为单线程执行)同时使用 8 个内核而不是 B) 为单个程序提供 8 个内核,我们可能会做得更好。
至少出于以下原因,现有功能不会突然从顺序执行变为并行执行:
- 传递给例程的函数或回调可能不准备同时调用
- 在 CPU 个核心之间仔细执行负载平衡的应用程序会发现自己突然做得很糟糕,因为假设 运行 在一个核心上的代码只使用了比预期更多的核心
- 即使应用程序不会使用 CPU 核心,库也无法预测应用程序的问题是否会真正受益于并行处理,即给定要处理的元素数量和处理单个元素的实际成本
您可能会注意到新的 API 明确允许并行处理,例如 Arrays
utility class 现在除了 sort
之外还提供 parallelSort
,等等
进一步注意 Stream API 也不允许 implicit 并行化,您必须请求并行流 explicitly , 使用 Collection.parallelStream()
或 Stream.parallel()
或使用 true
作为 StreamSupport
.
parallel
参数