在 .NET 中解析 FIX 协议消息的最有效方法是什么?

2024-05-27

我碰到这个非常相似的问题 https://stackoverflow.com/questions/2311205/the-best-way-to-parse-a-fix-message但该问题被标记为 QuickFIX(与我的问题无关),并且大多数答案都与 QuickFIX 相关。

我的问题更广泛。我正在寻找解析 a 的最有效方法固定协议 http://fixprotocol.org/使用 C# 发送消息。作为背景,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 标头中的少数特定标记感兴趣,而不是真正对每个可能的字段进行随机访问。我考虑过的策略包括:

  • Using String.Split,迭代每个元素并将标签放入哈希表中的索引映射 - 如果在某些时候需要的话,提供对所有字段的完全随机访问

  • (轻微优化)使用String.Split,扫描数组中感兴趣的标签,并将标签到索引映射放入另一个容器(不一定是哈希表,因为它可能是相当少量的项目,并且项目数量在解析之前已知)

  • 使用逐个字段扫描消息字段String.IndexOf并将感兴趣的字段的偏移量和长度存储在适当的结构中

关于前两个 - 尽管我的测量表明String.Split相当快,根据文档 http://msdn.microsoft.com/en-us/library/b873y76a.aspx该方法为结果数组的每个元素分配一个新的字符串,如果您正在解析大量消息,这可能会生成大量垃圾。谁能找到更好的方法来解决 .NET 中的这个问题?

EDIT:

我遗漏了三个重要信息:

  1. 标签在 FIX 消息中不一定是唯一的,即在某些情况下可能会出现重复的标签。

  2. 某些类型的 FIX 字段可以包含“嵌入”<SOH>' 在数据中 - 这些标签被称为“数据”类型 - 字典列出了这种类型的标签号。

  3. 最终的要求是能够编辑消息(特别是替换值)。


假设您通过网络获取这些消息或从磁盘加载它们。无论哪种情况,您都可以将它们作为字节数组进行访问,并以正向读取的方式读取字节数组。如果您想要/需要/要求高性能,请自己解析字节数组(为了高性能,不要使用标签和值的哈希表字典,因为相比之下,这非常慢)。自己解析字节数组还意味着您可以避免使用您不感兴趣的数据,并且可以优化解析以反映这一点。

您应该能够轻松避免大多数对象分配。您可以非常轻松且快速地将 FIX float 数据类型解析为双精度数,而无需创建对象(您可以使用自己的版本在此处大大超越 double.parse)。您可能需要更多考虑的唯一问题是字符串形式的标签值,例如FIX 中的符号值。为了避免在这里创建字符串,您可以想出一种简单的方法来确定每个符号(这是一种值类型)的唯一 int 标识符,这将再次帮助您避免在堆上分配。

正确完成的消息的自定义优化解析应该可以轻松超越 QuickFix,并且您可以在 .NET 或 Java 中无需垃圾回收即可完成这一切。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 .NET 中解析 FIX 协议消息的最有效方法是什么? 的相关文章

  • 该组件没有由 uri 标识的资源

    我想创建一个通用数据网格以在我的所有视图 用户控件上使用 这是我的结构 Class Library called Core Class called ViewBase public class ViewBase UserControl pu
  • 如何在没有 Visual Studio 的情况下将新文件添加到 .csproj 文件

    如何添加新文件到 csproj从命令提示符 我认为没有任何工具可以响应命令行上的 add project 命令来执行此操作 但我认为您可以幸运地创建一个程序 脚本来直接操作 csproj 文件的 XML 内容 csproj 文件的结构如下所
  • Sitecore - 隐藏功能区中的按钮

    我为特定内容项创建了上下文功能区 我有两个按钮 可以将项目 升级 或 降级 到某一类别 该部分只能有一个 是否可以根据某种隐藏代码中的内容状态隐藏其中一个按钮 我了解如何链接到 Click 事件 但我想知道是否有某种加载事件可供自定义功能区
  • 有谁知道一种更快的方法来执行 String.Split() 吗?

    我正在读取 CSV 文件的每一行 并且需要获取每一列中的各个值 所以现在我只是使用 values line Split delimiter where line是保存由分隔符分隔的值的字符串 衡量我的表现ReadNextRow我注意到它花费
  • 如何正确转义mysql?

    我刚刚发现如果我写 select from tbl where name like foo 然后添加 foo 作为参数及其值 a 用户数据 它不会正确转义 我勒个去 它想要 a 即使我使用参数 我还是忍不住觉得我对 sql 注入持开放态度
  • 当我使用 Image.FromFile() 时 FileNotFound

    我在这种情况下使用 Image FromFile string 方法 using System using System Collections Generic using System ComponentModel using Syste
  • c#.NET 和 sprintf 语法

    这段代码如何翻译成 C 具体来说是如何sprintf用C 实现 string output The user s logged in string loggedIn is string loggedOut isn t if TheUser
  • 为什么当要求修剪“PRN.NUL”时,TrimStart 会更多地修剪字符?

    这是代码 namespace TrimTest class Program static void Main string args string ToTrim PRN NUL Console WriteLine ToTrim string
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 抛出并保留堆栈跟踪不符合代码分析所描述的预期

    进行代码分析给了我项目 CA2200 CA2200 重新抛出以保留堆栈详细信息 func 重新抛出捕获的异常并将其显式指定为参数 请改用不带参数的 throw 以保留最初引发异常的堆栈位置 我已经实现了该建议 但无论如何我似乎都得到了相同的
  • Winforms 中的 WPF ElementHost 最大化时崩溃 (Windows)

    我正在尝试将新的 WPF 控件集成到现有的 WinForms 应用程序中 并使用 ElementHost Dock Fill 来托管以下 XAML UserControl NET 4 当我将 WinForm 设置为最大化时 我的整个操作系统
  • 家庭自动化图书馆[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我是一名 C 开发人员 希望将家庭自动化作为一种 爱好 我做了一些研究 但想知道是否有人知道支持 In
  • 使用 QuantLib 计算带有下限的 FloatingRateBond 的现金流量

    对 QuantLib 非常陌生 所以猜测这是一个菜鸟错误 很高兴了解这个强大的库 所以感谢作者和贡献者 如果没有下限参数 我可以在没有定价器的情况下为 FloatingRateBond 生成现金流量金额 所以我不明白为什么包含下限参数需要定
  • 如何有效确保小数值至少有 N 位小数

    我想在进行算术运算之前有效地确保十进制值至少有 N 个位置 在下面的示例中 3 显然我可以格式化 0 000 然后解析 但它的效率相对较低 我正在寻找一种避免与字符串转换的解决方案 我尝试过以下解决方案 decimal d 1 23M d
  • 如何消除字符串中的所有换行符?

    我需要删除字符串中出现的所有换行符 来自数据库 我使用下面的代码来做到这一点 value Replace r n Replace n Replace r 我可以看到至少有一个角色的行为就像行尾一样幸存了下来 字符代码是8232 http w
  • 在 SQL 2005+ 中,CLR 存储过程是否优于 TSQL 存储过程?

    我目前的观点是否定的 更喜欢 Transact SQL 存储过程 因为它们是重量更轻且 可能 性能更高的选项 而 CLR 过程允许开发人员进行各种恶作剧 然而最近我需要调试一些写得非常糟糕的 TSQL 存储过程 像往常一样 我发现许多问题是
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect

随机推荐

  • 自动部署资源

    我足够了解我们需要通过单个用户操作来部署我们的应用程序 但是 我don t know 在 NET 商店中可以使用哪些好工具 您如何管理每个环境的配置更改 有人可以给我指出一些用于持续集成的好资源吗 我希望看到一些理论以及逐步的实践指南 Ed
  • Node.js + Express.js |尝试设置 HTTPS 服务器

    我正在尝试使用 Node js 和 Express js 设置 HTTPS 服务器 我目前正在尝试 const filesystem require fs const express require express const server
  • Xamarin MasterDetailPage 看起来很难看

    I m trying to create a MasterDetailPage and I am not quite sure if I am doing that right but the drawer master just look
  • Oracle 事务在 C++ 和 Java 之间的传播

    我们有一个现有的 C 应用程序 我们将逐步将其替换为新的基于 Java 的系统 在我们用 Java 完全重新实现所有内容之前 我们期望 C 和 Java 必须相互通信 RMI SOAP 消息传递等 我们尚未决定 现在我的经理认为我们需要 J
  • Pandas 在读取 SAS 文件时数据类型正确失败

    我有一个SAS数据集 http www principlesofeconometrics com sas cars sas7bdat当我运行它时 我在 SAS 上得到以下输出 我还有以下 Python 代码 它获取 sas7bdat 文件并
  • 底部带有缩略图的轮播

    在 Codenameone 应用程序中 我尝试开发一个底部带有缩略图列表的轮播 我使用 Tabs 控件在表单中心以轮播样式显示文件 具有不同类型 如图像 视频 文本 按钮等 并使用另一个 Tabs 控件在底部显示缩略图图像 第一个轮播文件的
  • 如何在 Pro*C 查询中指定变量表达式列表?

    我尝试优化的 Pro C 查询出现问题 解释一下 我们的应用程序在一个巨大的数据库中搜索行 这些行存在于多种语言中 旧代码为数组中的每种语言选择一行 现在 由于这些查询是我们应用程序中最耗时的部分 因此我只想进行一个直接写入数组的查询 语言
  • iOS 的 IAP 收据验证

    我正在开发一个客户端 服务器应用程序 它使用 Apple 的 IAP 和 StoreKit 框架来购买订阅 我们希望客户 iPhone 或 iPad 能够使用 StoreKit 框架通过其 iTunes 帐户向 Apple 进行初始订阅购买
  • 是否可以打开包含类的 .txt/.java 文件,并对其使用反射?

    我的意思是 将其中包含 Java 代码的文件作为类而不是文件打开 所以基本上我想 gt 在自己编写的Java应用程序中打开纯文本文件 txt log java gt 识别文件中的类 例如 public class TestExample p
  • 错误:“raw.githubusercontent.com”的证书不受信任

    我正在尝试使用 wget 通过远程服务器 ssh 从 github 检索一些文件 这是我得到的 wget https raw githubusercontent com aseemk seadragon ajax master seadra
  • 我可以在 NetBeans 中使用或导入 Eclipse 格式化程序吗?

    我们已经使用 Eclipse 很长时间了 我们的每个项目都有格式化程序 现在 我们中的一些人正在转向 NetBeans 是否可以将 Eclipse 格式化程序迁移 同步 导入到 NetBeans 我尝试将 Eclipse 项目导入 NetB
  • 如何在 pandas 中创建求和行和求和列?

    我正在学习可汗学院的统计课程 作为我大学时代的复习 也是让我加快掌握 pandas 和其他科学 Python 的一种方式 我有一张来自可汗学院的表格 看起来像这样 Undergraduate Graduate Total Straight
  • AWS CodeBuild - 如何跳过构建

    我的构建是在每次推送到存储库和每次拉取请求时触发的 因此 CODEBUILD SOURCE VERSION 看起来像 pr 8 或 4570d2e7158cfef687af8da31d1ffec7b02e5ca3 我只希望为 pr 分支执行
  • Android - 材料设计 - NavigationView - 如何放置垂直滚动?

    我正在使用 NavigationViewcompile com android support design 22 2 1 嗯 一切都很好 除非它没有垂直滚动 如何通过xml设置呢 xml
  • 如何使用 maven 或 pom.xml 更新属性文件

    我创建了一个自动化框架 在其中读取属性文件 config properties 中的值 我的 config properties 文件包含以下内容 BrowserName browser Environment env 我正在从属性文件中读
  • JetBrains Rider 可以与 IISExpress 正常工作吗?

    我使用的JetBrains Rider是官网最新版本2019 1 2 免费30天试用 这不是一个损坏的版本 我有一个包含 ASP NET Web API csproj 的解决方案 该解决方案在 IIS 或 VS IISExpress 中正常
  • after_or_equal 验证在 laravel 5.2 中不起作用

    我想比较 start date 和 end date 并且 end date 应等于或大于 start date 我正在使用 after or equal 验证 return Validator make data start date g
  • 如何保留每个单元格中合并单元格的值?

    我创建了一个包含合并单元格的工作表 但合并单元格的值仅存储在第一个单元格中 无论如何 为了在每个单元格中保持相同的值 我使用的公式需要它 谢谢 在 Excel 2003 中 此宏执行以下任务 Public Sub UnmergeAndFil
  • 如何在 symfony 4 注销中重定向到外部网址

    只是想知道 Symfony 4 中是否有一个简单的解决方案 通常用户会注销并返回主页 但是有一个页面会检查用户当前是否在另一个站点上进行了身份验证 如果这是不正确的 我有一个链接可以将用户从我的站点中注销并重定向到外部站点 我在基于 sil
  • 在 .NET 中解析 FIX 协议消息的最有效方法是什么?

    我碰到这个非常相似的问题 https stackoverflow com questions 2311205 the best way to parse a fix message但该问题被标记为 QuickFIX 与我的问题无关 并且大多