1

我使用无界链接阻塞队列实现了类似于消费者-生产者问题的东西。我让生产者将对象放入队列并让消费者接受它。当我测试程序时,每次试验的线程数量加倍,同时仍然处理相同数量的对象,所有试验的时间似乎是恒定的。它应该是恒定的吗?或者更多的线程意味着更快的处理?不确定是否是我的代码导致共享资源缓慢或同步。有任何想法吗?

4

3 回答 3

3

这完全取决于瓶颈是什么:

  • 如果消费者处理元素的速度与生产者生产元素的速度一样快,那么添加更多消费者将无济于事
  • 如果消费者是瓶颈,那么增加更多的生产者只会意味着你积压了工作
  • 如果消费者都在共享一个已经用尽的资源(例如饱和的网络连接或磁盘),那么添加更多线程将无济于事
  • 如果消费者在共享资源上同步,这迫使他们在大部分时间以串行方式工作,那么添加更多线程将无济于事
  • 如果消费者受 CPU 限制,并且您有足够的线程来最大化 CPU 使用率,那么添加更多线程将无济于事

您需要查看程序运行时发生的情况:

  • 您的工作队列的长度是多少?它只是继续增长吗?它总是接近于0吗?
  • 您的 CPU 使用率如何?网络/磁盘使用情况如何?

然后分析您的代码在做什么,并计算出您期望问题的可并行化程度

于 2012-10-11T06:14:48.187 回答
0

可能是你的同步。假设您的单个队列一次只消费一个项目,在您消费或生产时阻塞其他消费者,那么如果您想要更高的吞吐量,您需要更多的队列。

于 2012-10-11T06:16:25.267 回答
0

这是一个组合,你必须尝试找到一个接近最优的解决方案。让我们从单核系统开始。在那里你必须找到等待(通常是 IO)和计算时间的平衡。你可以根据你在做什么使两者都饱和。例如,如果您受到磁盘速度的限制,您无法通过添加更多线程来获得任何收益。相反,您可能会弄乱磁盘调度并且性能会降低。另一方面,如果您从不等待 IO,那么您的工作就处于另一个极端,您不会通过在单核处理器上添加更多线程来获得任何收益。

在多核系统上,只要不等待 IO,就可以增加线程数来提高性能。更多的核心不会帮助你。但是与 IO 一样,添加线程也会产生开销,所以不要太高。

于 2012-10-11T06:22:08.070 回答