2014-08-28 69 views
-2

我在客户端(生产者)和服务器端的一个线程(消费者)8线程什么是更快的一个并发队列或8个无锁队列?

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

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

+1

不知道。当你测试每个选项时哪个更快? – admdrew 2014-08-28 19:33:50

+0

您可以通过不旋转来加快速度。 – juanchopanza 2014-08-28 19:46:15

+0

您需要执行多少次测试以确保法拉利比驴子快? – javapowered 2014-08-28 19:47:34

回答

1

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

  • ,如果你有足够的硬件核心(如果他们不采取其他进程),您的纺纱实际上可能提高吞吐量通过使用所有硬件容量在客户端大小上。在这种情况下,单个锁定队列会降低客户端核心速度:队列同步可能是他们的瓶颈,迫使他们依次运行。如果你有8个单独的队列,只有一个队列会被消费者放慢速度。

  • 如果不是,那么每个线程将一直等待其他人在工作。在这种情况下,单个锁定队列不应对整​​体性能产生重大影响。但是旋转并不会提高性能(事实上,上下文切换可能会减少一点),应该考虑到批判性思维。

  • 在这两种情况下,单个消费者一次只能处理一件物品。对于消费它不应该产生巨大的变化,如果它从8个队列或从1

读取但是当你看到这件事很复杂。如果生产者以不同的速度运行(更高的优先级或其他处理器,或者消费代码比生产代码短得多),则需要重新考虑分析。所以建议预见一些基准(端到端吞吐量)。