STD队列:高效还是过度杀伤?

时间:2014-10-18 23:41:20

标签: c++ queue

我正在解析拥有大量数据的金融市场数据Feed。

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

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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