我使用无界链接阻塞队列实现了类似于消费者 - 生产者问题的东西。我让生产者把对象放到队列中,消费者把它拿走。当我测试程序时,每次试验的线程数增加一倍,同时仍然处理相同数量的对象,所有试验的时间似乎是不变的。这是假设是不变的吗?或更多线程意味着更快的处理?不确定是否是我的代码导致共享资源的缓慢或同步。有什么想法吗?
答案 0 :(得分:3)
这完全取决于瓶颈是什么:
您需要查看程序运行时发生的事情:
然后分析您的代码正在做什么,并找出您期望问题的并行化程度
答案 1 :(得分:0)
可能是您的同步。假设您的单个队列一次仅消耗一个项目,在您消费或生产时阻止其他消费者,那么如果您想要更多吞吐量,则需要更多队列。
答案 2 :(得分:0)
这是一个组合,你必须尝试找到一个接近最优的解决方案。让我们从一个核心系统开始吧。在那里你必须找到等待的平衡(通常是IO)和计算时间。你可以根据你在做什么来使两者饱和。例如,如果您受磁盘速度的限制,则无法通过添加更多线程获得任何收益。相反,您可能会陷入磁盘调度并且性能会降低。另一方面,如果您从不等待IO,那么您的工作就处于另一个极端,您将无法通过在单个核心处理器上添加更多线程来获得任何收益。
在多核系统上,只要您不等待IO,就可以增加线程数以提高性能。更多内核对您没有帮助。但与IO一样,添加线程会产生开销,所以不要太高。