我有一个看起来像这样的子系统:
[read] [decode] [deliver]
Byte --> Undecoded --> Decoded --> Output queue
stream message message
输入是一个套接字/字节流。第一步是阅读消息。下一步是解码消息(并将结果存储在消息对象中)。最后一步是传递消息。
我想并行化解码步骤,但我必须保持输出顺序与输入顺序相同。因此,如果收到消息 A 和 B 并且消息 B 的解码速度更快,我必须等到 A 完成才能传递它。
我在 Java 中做了一个简单的初始实现,但我的分析表明我在切换步骤(从“流读取器”到“解码器”以及从“解码器”到输出)丢失了太多。在 24 核计算机(包括超线程)上运行测试程序时,我得到:
- 运行单线程实现时为 1100 K msg/s。
- 运行简单的 12 线程实现(有很多队列)时为 110 K msg/s。
我的幼稚实现可在http://pastebin.com/be1JqZy3获得。它有超过 200 行代码,所以它可能只会对那些真正想知道如何使并行版本比串行版本慢 10 倍的人感兴趣(提示:开始看类 ThreadPoolDecoder)。
在执行此类问题时,是否有人可以使用模式/框架,其中工作继续(基于流)可以并行化但必须在输出时进行排序?