对于 CPU 密集型工作的线程池中的多个线程的一般建议是,逻辑 CPU 最多有一个线程。在 JVM 上,使用
Runtime.getRuntime().availableProcessors()
是一种常见的做法,这也在 Scala 执行上下文和任务支持中使用来确定默认的并发级别,请参阅:
https://www.scala-lang.org/api/2.12.2/scala/collection/parallel/index.html#availableProcessors:Int
scala 并行任务:
private[parallel] final class FutureTasks(executor: ExecutionContext) extends Tasks {
//....
def parallelismLevel = Runtime.getRuntime.availableProcessors
}
最近一些CPU引入了高效和性能核心的概念。这会以任何方式改变建议吗?在最大化 CPU 密集型任务的吞吐量时,利用所有核心(包括高效核心)被认为对性能有利,还是线程池应该仅限于性能核心?是否有任何 API 允许应用程序像这样查询异构 CPU 配置?
我最感兴趣的是 JVM,但 Windows、Linux 或 MacOS 的本机 API 也可能很有趣。我对如何检测 Intel Alder Lake CPU 中的 P/E-Core? 中讨论的线程控制不感兴趣,只对类似于
availableProcessors
的一般系统功能信息感兴趣,但包括有关非统一架构的一些详细信息.
你问了很多问题,但你是从这个开始的:
对于 CPU 密集型工作的线程池中的多个线程的一般建议是,逻辑 CPU 最多有一个线程。在 JVM 上,常见的做法是使用
...Runtime.getRuntime().availableProcessors()
您所说的“一般建议”只是一个经验法则。更好的建议是调整要优化的线程数量...无论您要优化什么。
事实上,我不相信使用这样的代码是“常见做法”。事实上,我怀疑更常见的是在配置文件中指定线程数,或者(就像公共线程池的情况)让 JVM 决定,无论它如何决定。
最近一些CPU引入了高效和性能核心的概念。这会以任何方式改变建议吗?
嗯......你必须咨询给你建议的人或网站。
但是一般来说我不会影响我给出的建议。
一般来说,有很多因素会影响应用程序的吞吐量。例如,应用程序的性质与线程数量同样重要;例如
实际上,有太多因素难以量化,任何经验法则都行不通。
在最大化 CPU 密集型任务的吞吐量时,利用所有核心(包括高效核心)被认为对性能有利,还是线程池应该仅限于性能核心?
我不知道是否有人尝试过对 Java 应用程序进行理论上的建模或经验上的测量。但考虑到为我们提供“每个核心一个线程”的建模的简单性,我怀疑人们能否提出一个具有“预测性”的理论或经验模型。
是否有任何 API 允许应用程序像这样查询异构 CPU 配置?据我所知。
而且我不确定您是否能够在 Java 应用程序中充分利用这些信息。