我遇到了这个非常相似的问题,但该问题被标记为 QuickFIX(与我的问题无关),并且大多数答案都与 QuickFIX 相关。
我的问题更广泛。我正在寻找使用 C#解析FIX 协议消息的最有效方法。作为背景,FIX 消息由一系列由 ASCII<SOH>
字符 (0x01) 分隔的标记/值对组成。消息中的字段数是可变的。
示例消息可能如下所示:
8=FIX.4.2<SOH>9=175<SOH>35=D<SOH>49=BUY1<SOH>56=SELL1<SOH>34=2482<SOH>50=frg<SOH>
52=20100702-11:12:42<SOH>11=BS01000354924000<SOH>21=3<SOH>100=J<SOH>55=ILA SJ<SOH>
48=YY77<SOH>22=5<SOH>167=CS<SOH>207=J<SOH>54=1<SOH>60=20100702-11:12:42<SOH>
38=500<SOH>40=1<SOH>15=ZAR<SOH>59=0<SOH>10=230<SOH>
对于每个字段,标签(整数)和值(我们的目的是字符串)由“=”字符分隔。(每个标签的精确语义在协议中定义,但这与这个问题并不是特别密切相关。)
通常情况下,在进行基本解析时,您只对 FIX 标头中的少数特定标签感兴趣,而不是真正对每个可能的字段进行随机访问。我考虑过的策略包括:
使用
String.Split
, 遍历每个元素并将标签到索引映射放在哈希表中 - 如果在某些时候需要,可以提供对所有字段的完全随机访问(轻微优化)使用
String.Split
,扫描数组以查找感兴趣的标签并将标签到索引映射到另一个容器(不一定是哈希表,因为它可能是相当少量的项目,并且在解析之前知道项目的数量)String.IndexOf
使用并以适当的结构存储感兴趣字段的偏移量和长度,逐个字段扫描消息
关于前两个 - 尽管我的测量结果表明String.Split
速度非常快,但根据文档,该方法为结果数组的每个元素分配一个新字符串,如果您解析大量消息,这可能会产生大量垃圾。任何人都可以在 .NET 中找到解决此问题的更好方法吗?
编辑:
我遗漏了三个重要信息:
标签在 FIX 消息中不一定是唯一的,即在某些情况下可能会出现重复的标签。
某些类型的 FIX 字段可以
<SOH>
在数据中包含“嵌入”——这些标签被称为“数据”类型——字典列出了这种类型的标签号。最终的要求是能够编辑消息(尤其是替换值)。