我有大约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提供了很好的插入性能。
有人可以给我一些提示或建议我可能在这种情况下做错了什么?
谢谢。
我不认为所有的核心(8)都是免费的。即后台服务,OS系统也在使用它们。尽量减少游泳池,即减少到6 – HRgiger
最缓慢的是队列备份,而不是执行器本身。 – OldCurmudgeon
快速找出问题所在增加堆的方法。如果移动的速度比您关心的数据快。 –