【问题标题】:STD Queue: Efficient, or overkill?STD 队列:高效还是矫枉过正?
【发布时间】:2014-10-19 08:07:29
【问题描述】:

我正在解析一个包含大量数据的金融市场数据源。

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

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

以我感兴趣的字符串为条件,我的问题是:

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

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

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

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

【问题讨论】:

  • “会丢失数据”是什么意思?消息是如何到达的?不会只是延迟一点吗?另外,我不确定您所说的“调用线程”是什么意思。为每条传入消息创建一个新线程并不是一个非常有效的解决方案。而是使用具有固定线程数的生产者-消费者队列。
  • 在这里为我非常糟糕的词汇道歉。我是 C++ 新手。有一个 void 例程传递感兴趣的字符串和字符串类型的值。声明是:void CIBTraderDlg::tickString(TickerId tickerId, TickType tickType, const CString& value) 我已经需要一个关于 ticktype 的 IF。所以我不知道我是应该继续在这里解析字符串还是将其推入队列以由不同的线程解析。
  • 抱歉,这并不能真正帮助我理解您在做什么。是否可以发布一些相当小的代码示例,让我们了解您的设置。省略所有不相关的功能,只保留您当前的设计框架。
  • 根据您的最后一条评论,您似乎已经在使用一些已经存在的代码库或一些现有的 3rd 方库。这类问题完全取决于每个特定情况。对于每种给定的情况,没有通用的“这是最好的方法”的答案,这始终是正确的,并且始终适用于当前在太阳系第三工厂使用的每个软件库、平台、操作系统。在这里得到答案的唯一方法是尝试不同的方法,并运行一些基准来确定哪一个产生最快的结果。
  • 感谢你们,是的,这是我正在编辑的 API 示例应用程序。我不控制接收请求市场数据的消息以确保安全的功能,每次数据到达时都会自动调用此例程。我需要解析和使用字符串。我是所有这一切的新手,我希望你在需要处理大量数据时如何处理这些情况是一个干净的“对或错”。

标签: c++ queue


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢你教我一些关于线程和内核的知识,同时完美地回答了我的问题。
  • 总是乐于提供帮助:)
  • 我很荣幸几乎可以立即获得这样的帮助,而且我无需支付任何费用。这是给我的礼物,我谢谢你。
猜你喜欢
  • 2015-03-09
  • 2014-10-31
  • 2013-01-10
  • 1970-01-01
  • 2012-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多