我需要完成大约100000个任务,我知道它们是CPU密集型的,但只需要很短的执行时间(当CPU足够快时)。
我使用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 :(得分:1)
问题属于LinkedBlockingQueue的性能下降。在我的情况下,生产者在向队列添加数据方面更有效率,而消费者处理的速度太慢。