【发布时间】:2012-02-19 16:23:10
【问题描述】:
我正在使用 TIBCO RV .NET API (TIBCO.Rendezvous.dll)。
您知道在性能方面是否有更好的方法来接收和读取来自 RV 频道的消息在 C# 中?我发现Message 类型(RV 消息的逻辑包装器)非常繁重。 通过名称或索引获取字段可能非常慢,尤其是当我们将其视为循环/高频操作时。
有什么想法吗?
【问题讨论】:
标签: c# .net optimization tibco tibco-rv
我正在使用 TIBCO RV .NET API (TIBCO.Rendezvous.dll)。
您知道在性能方面是否有更好的方法来接收和读取来自 RV 频道的消息在 C# 中?我发现Message 类型(RV 消息的逻辑包装器)非常繁重。 通过名称或索引获取字段可能非常慢,尤其是当我们将其视为循环/高频操作时。
有什么想法吗?
【问题讨论】:
标签: c# .net optimization tibco tibco-rv
c# 包装器的主要问题在于:
这些方面将使基于字段/名称的底层查找的开销相形见绌,当您知道需要按顺序遍历字段来查看消息中的每个字段时,这些开销本身就可以避免。这在 C/C++ 中速度很快,因为它在内存中线性工作,因此对缓存友好。
我们个人直接用 C++ CLI 封装了 C++ api(当时 .net 库质量不合格)。这很复杂(特别是如果您有多个应用程序域),但性能与 C++ api(C api 上的一个非常薄的包装器)接近。
如果您的分析告诉您消息访问中的分配阻止您的应用程序以您需要/想要的速度运行,我担心您的 .net 库会出现问题。您可以使用反射来获取原生消息的底层 IntPtr,然后使用 MessageToolbaox(dll 中的内部类)中相同的外部定义函数,这些函数下拉到原生 api,每次访问内部字段的成本更快的字段查找可能会抵消消息。这显然很脆弱且难以维护,但是如果您发现与完全重新实现其包装器相比它是值得的,它可能会有所帮助。
【讨论】:
我也见过同样的事情。根据我的经验,与在 C++ 中访问它们相比,访问 C# Rv 消息中的字段非常慢。因此,您要避免在消息中添加和读取多个字段。
一种解决方案是不使用 Rv 自己的消息序列化。也就是说,不要用Message.AddField()添加很多字段,或者用Message.GetField()获取它们。相反,您可以将数据序列化为不透明类型(这是一个二进制缓冲区,即字节数组)。然后,您可以将此单个字段添加到消息中。
如果您所做的只是读取和写入一个字段,则开销很小。而且您应该能够非常快地在自己的代码中序列化和反序列化数据。
【讨论】: