【发布时间】:2016-08-08 06:33:54
【问题描述】:
我最近在评估时遇到了这个问题:
ExecutorService threadpool = Executors.newFixedThreadPool(N);
for(Runnable task : tasks){
threadpool.submit(task);
}
每个任务花费 25% 用于计算,75% 用于 I/O。假设我们正在使用四核机器(无超线程),线程池 N 的大小应该是多少才能在不浪费线程的情况下实现最大性能? (假设我们有无限的 I/O 容量)
我猜是 16,因为机器有无限 I/O,这意味着我们可以完全专注于 CPU。每个任务在运行时使用四分之一的 CPU。这意味着,我们可以运行四个任务以使一个 CPU 核心饱和,这使得 N=16 在四核机器上。
更新:这个问题的选项是 2、4、5、6、7、8、12 和 16。
【问题讨论】:
-
你的答案是什么,你是怎么想出来的,为什么你认为它不是正确的答案?
-
我的答案是 16,因为机器有无限的 I/O,这意味着我们可以完全专注于 CPU。每个任务在运行时使用四分之一的 CPU。这意味着,我们可以运行四个任务以使一个 CPU 核心饱和,这使得 N=16 在四核机器上。
-
听起来对我来说是正确的答案。
-
但这不是正确的解决方案。我没有收到任何反馈。
-
根据this blog,根据 Goetz 和 Subramaniam 的 IO Bound Tasks 公式,16 是答案。
标签: java multithreading concurrency