【问题标题】:What is faster one concurrent queue or 8 lock-free queue?1 个并发队列和 8 个无锁队列哪个更快?
【发布时间】:2014-08-28 19:27:47
【问题描述】:

我在客户端(生产者)有 8 个线程,在服务器端(消费者)有 1 个线程

消费者线程正在旋转检查是否有新数据到达。我有两个选择来实现这个:

  • 使用一个concurrent queue,所有 8 个生产者都发布到同一个队列,服务器旋转和try_pop 它

  • 使用 8 个无锁 single producer single consumer queue。每个生产者发布到自己的队列,但消费者应该检查 8 个查询而不是一个。

我认为检查 8 个无锁查询必须比检查一个阻塞队列快得多(因为阻塞是昂贵的!)。所以我倾向于使用8 spsc_queue。如果我是对的,您有什么建议?

【问题讨论】:

  • 不知道。当您测试每个选项时,哪个更快?
  • 不旋转可以加快速度。
  • 您需要进行多少次测试才能确保法拉利比驴快?
  • @javapowered "ferrari is faster than a donkey" 环境很重要!

标签: c++ concurrency


【解决方案1】:

答案很大程度上取决于您的系统架构。所以首先,如果你的 8 个线程真的可以并行运行,请检查 harware_concrurrency():

  • 如果您有足够的空闲硬件内核(并且如果它们没有被其他进程占用),您的旋转实际上可以通过使用所有硬件容量来提高客户端大小的吞吐量。在这种情况下,单个锁定队列会减慢客户端内核的速度:队列同步可能是它们的瓶颈,迫使它们一个接一个地运行。如果您有 8 个单独的队列,则只有一个会被消费者拖慢。

  • 如果不是,那么每个线程都会在其他线程工作时一直在等待。在这种情况下,单个锁定队列应该不会对整体性能产生重大影响。但是旋转不会提高性能(事实上,上下文切换甚至可能会降低一点),应该以批判的心态来考虑。

  • 在这两种情况下,单个消费者一次只能处理一项。对于消费而言,如果它从 8 个队列或 1 个队列中读取,应该不会有太大的不同。

但正如您所见,事情很复杂。如果生产者将以不同的速度运行(更高优先级或在另一个处理器上,或者消费代码明显短于生产代码),则需要重新考虑分析。因此,建议预见一些基准(端到端吞吐量)。

【讨论】:

    猜你喜欢
    • 2023-04-09
    • 2013-03-21
    • 2017-03-28
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    相关资源
    最近更新 更多