我正在使用TIBCO RV .NET API (TIBCO.Rendezvous.dll)。
您是否知道在性能方面是否有更好的方法可以在 C# 中从 RV 通道接收和读取消息?我发现Message
类型 - RV 消息的逻辑包装器 - 非常重。通过名称或索引获取字段可能会非常慢,尤其是当我们将其视为循环/高频操作时。
有任何想法吗?
我正在使用TIBCO RV .NET API (TIBCO.Rendezvous.dll)。
您是否知道在性能方面是否有更好的方法可以在 C# 中从 RV 通道接收和读取消息?我发现Message
类型 - 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()获取它们。相反,您可以将数据序列化为不透明类型(这是一个二进制缓冲区,即字节数组)。然后,您可以将此单个字段添加到消息中。
如果您所做的只是读取和写入一个字段,则开销很小。而且您应该能够非常快地序列化和反序列化您自己的代码中的数据。