javac对CPU利用率感到疯狂ECJ能够为多线程生产者 - 消费者维持可预测的CPU利用率

时间:2013-11-19 10:10:52

标签: java eclipse multithreading javac cpu-usage

我正在运行1个Producer线程,1个带有共享缓冲区和临时缓存(1000个元素)的Consumer线程问题。

eclipse执行(ECJ)使用33%的CPU(生产者为1核,消费者为1,主线为{最小处理}为1)。

在执行在javac上编译的相同代码时,我看到利用率为50%(所有8个虚拟核心都显示了一些处理)。

我使用的是Windows 8;具有超线程的四核系统(因此是8个虚拟核)。

有人可以解释一下吗?我的代码在2个优化中的表现如此不同?

这是代码: http://pastebin.com/NBkRTcxV

回顾一下:我想知道为什么javac编译比ECJ使用了更多的CPU?请理解我只有2个线程(1个生产者和1个消费者),所以理想情况下只应使用2个核心(= 1个物理核心)(= 25%CPU)

2 个答案:

答案 0 :(得分:2)

CPU可以自由地在不同的内核之间划分线程。有一些本机库允许您设置线程亲和性,例如我们自己的Peter Lawrey的library

答案 1 :(得分:2)

  

有人可以解释一下吗?我的代码在2个优化中的表现如此不同?

操作系统线程调度程序很可能正在执行此操作,而与编译器无关。

我的猜测是操作系统的线程调度程序注意到Eclipse线程具有交互行为(例如,在Java中处理窗口事件等),并保留容量来处理这个问题。

但它也可能是你的基准测量的一些人工制品。人工基准通常会遇到这个问题。


更新 - 如果您确信它是编译器(javac与ejc),那么您可以通过从各自的编译器获取编译代码并从命令行执行它来证明或反驳这一点。 / p>

另一件事是使用更大比例的CPU实际上是一件好事。测量执行“工作”量的时间。 “javac”版本可能会使用更多CPU,因为它的工作速度更快。

维持可预测的CPU利用率通常不是设计目标。人们通常更关心应用程序执行(有用)工作的速度。