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