作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有大约 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 为插入提供了良好的性能。
有人可以给我一些提示或建议吗?在这种情况下我可能会做错什么?
谢谢。
最佳答案
问题属于LinkedBlockingQueue的性能下降。就我而言,生产者在向队列添加数据方面效率更高,而消费者则处理速度太慢。
关于java - 随着时间的推移,FixedThreadPool 中的执行速度会变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36843866/
我是一名优秀的程序员,十分优秀!