2016-04-25 88 views
0

我有大约100000个任务需要完成,我知道他们是CPU密集型的,但只需要很短的执行时间(当CPU足够快时)。FixedThreadPool中的执行速度会随着时间的推移而变慢

我用ExecutorService executor = Executors.newFixedThreadPool(8);

我选择8,因为我的CPU有8个内核。

然后通过所有这些过程我的任务,我的循环:

for(Task task : tasks) { 
    executor.submit(new Runnable() { 
    // 1. Text analyzing 
    // 2. Add result to a LinkedBlockingQueue 
    } 
} 

我观察到的是,前几十万的任务,这是非常快。但是,然后,说10K任务已经处理后,速度变得更慢,并且速度更慢...

我试图理解,但未能弄清楚为什么它逐渐变慢。由于任务完成后,资源也将被释放。所以我预计处理速度应该是稳定的。

然后我发现问题可能属于我用来存储任务结果的LinkedBlockingQueue。但似乎LinkedBlockingQueue提供了很好的插入性能。

有人可以给我一些提示或建议我可能在这种情况下做错了什么?

谢谢。

+0

我不认为所有的核心(8)都是免费的。即后台服务,OS系统也在使用它们。尽量减少游泳池,即减少到6 – HRgiger

+1

最缓慢的是队列备份,而不是执行器本身。 – OldCurmudgeon

+0

快速找出问题所在增加堆的方法。如果移动的速度比您关心的数据快。 –

回答

1

该问题属于LinkedBlockingQueue的性能下降。就我而言,生产者在向队列中添加数据方面效率更高,而消费者的处理速度太慢。

Java performance problem with LinkedBlockingQueue

+0

请注意,这不是'Queue'的性能问题。这是一个关闭队列的问题。所需的'LinkedBlockiingQueue'将闪电般快速。 –

相关问题