【发布时间】:2013-09-15 06:01:43
【问题描述】:
以下是 Java Concurrency in Practice 第 12.2 章 Testing for Performance 一书的节选,其中作者谈到了有界缓冲区实现的吞吐量。
图 12.1 显示了在 4 路机器上使用缓冲区的一些示例结果 容量为 1、10、100 和 1000。我们立即看到缓冲区 大小为 1 会导致吞吐量非常低;这是因为每个线程 在阻塞和等待之前只能取得一点点进展 另一个线程。将缓冲区大小增加到 10 会有很大帮助,但是 增加超过 10 会提供递减收益。
添加更多线程一开始可能有点令人费解 只会稍微降低性能。原因很难看出 数据,但很容易在诸如 perfbar 之类的 CPU 性能计上看到 测试正在运行:即使有很多线程,计算量也不多 继续进行,其中大部分用于阻塞和解除阻塞线程。所以 有足够的 CPU 空闲时间让更多线程做同样的事情 不会对性能造成太大影响。
但是,请谨慎从这些数据中得出结论,您可以 总是将更多线程添加到使用 有界缓冲区。这个测试在模拟的方式上是相当人为的 应用;生产者几乎不做任何工作来生成项目 放在队列中,消费者几乎不处理该项目 取回。如果工作线程在真正的生产者-消费者中 应用程序做一些重要的工作来生产和消费物品(如 一般情况下),那么这种松弛就会消失,并且 线程过多的影响可能非常明显。这 这个测试的主要目的是测量哪些约束 通过有界缓冲区进行的生产者-消费者切换强加于整体 吞吐量。
作者这里的cpu slack是什么意思?为什么随着线程数量的增加,吞吐量不会越来越下降?我没有遵循作者给出的关于在添加越来越多线程时性能轻微下降的推理,假设缓冲区大小的界限保持不变。
编辑:我能想到一个原因:因为在这种情况下,线程并没有真正的工作,所以共享内存总线上的流量增加的经典问题,由于缓存未命中的数量随着越来越多的线程被添加,线程的上下文切换并没有发挥主要作用。一旦线程开始做更多的工作,情况就会改变。这就是作者在第三段中试图表达的意思吗?
【问题讨论】:
标签: multithreading performance concurrency performance-testing java.util.concurrent