c++ - STD 队列 : Efficient, 还是矫枉过正?

标签 c++ queue

我正在解析包含大量数据的金融市场数据提要。

我将收到一个字符串并提取一个值,我会将其存储在一个全局声明的变量中。

程序是这样工作的:当数据(字符串)到达时,调用一个线程。该线程检查与字符串一起传递的值以了解它是什么类型的字符串。

条件是它是我感兴趣的那种字符串,我的问题是:

是将字符串传递到队列中进行解析,还是直接在调用的线程中直接解析更好。

从概念上讲,我担心如果我要求调用的线程做工作,那么它可能无法用于后续高频发生的市场数据事件,我会丢失数据。

如果我要将字符串放入队列中,我当然需要另一个线程从队列中弹出项目并解析它们。

我有一台非常快的 PC,速度是我的兴趣所在。董事会是否有经验并且知道这里的最佳方法是什么?

最佳答案

真正的问题是,您更关心系统的延迟,还是吞吐量

如果您针对延迟进行了优化,这意味着您希望在事件发生时立即响应(高频交易中通常是这种情况),您可能会尽量避免将变量传递给另一个线程,因为这会产生不必要的减速并且会增加你的延迟。特别是,在针对延迟进行优化时,您希望 CPU 缓存不会失效,如果您使用多线程(好吧,至少比单线程更频繁),这种情况经常发生。此外,与通过网络发送内容相比,检查特定字符串包含的内容确实快,这意味着如果这是唯一的操作,您不必担心有太多消息传入并等待处理.即使发生这种情况,消息也会在内核队列中轻轻等待一微秒,而您正在处理前一个消息。换句话说,我假设如果你每秒收到的消息少于 30 万条(我敢打赌你会这样做)并且你唯一要做的就是检查字符串是否包含模式,你不应该去线程。

另一方面,如果您更关心吞吐量 - 意味着您确实有很多消息(想想每秒成百上千条),或者您正在进行更繁重的计算,而不是仅仅在字符串中搜索模式, 那么最好在另一个线程中使用队列和处理事件。

关于c++ - STD 队列 : Efficient, 还是矫枉过正?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26445707/

相关文章:

java - 在Java中是否有一个具有类似 `BlockingQueue.drainTo`功能的HashSet?

node.js - 在单个进程中排队 javascript 代码

c++ - BOOST_LOG_TRIVIAL ( severity ) << ... 不重定向到文件

c++ - 将自己的大小插入到 std::map

c++ - 使用 JIT 设计虚拟机

c++ - 穿 Frog 游戏的最佳图形选择?

c++ - 虚函数默认参数行为

python - 相当于 asyncio.Queues 与 worker "threads"

ios - 为什么异步并行队列在最后运行

Node.js (ES6) - 使用 Promise.all 的 Promise 控制流