首页 > 解决方案 > 如何在不使用异常的情况下判断缓冲区是 Google 协议缓冲区(Protobuf)消息还是其他内容?

问题描述

TLDR:我需要确定一个 byte[] 是否属于 protobuf 消息。有没有一种有效的方法可以在没有 try/catch 块的情况下做到这一点?

我正在将 protobuf 添加到 C# 消息监视应用程序的现有消息集中。我需要以 ~100Hz 的频率解析消息,我的消息集中大约有 40 条消息。目前我尝试使用以下代码解析 protobuf 消息:

public bool IsProtobuf(byte[] Data){
   try
   {
       Any anyMsg = Any.Parser.ParseFrom(Data);
       bool isProtobuf = anyMsg.Is(protobuf_message.Descriptor);
       if(isProtobuf)
       {
           protobuf_message parsed = protobuf_message.Parser.ParseFrom(Data);
           return true;
       }
   }
   catch (InvalidProtocolBufferException)
   {
       return false;
   }
}

然而,try/catch 块真的会降低我的性能。我从没有任何 protobuf 消息的 ~2000Hz 消息解析到使用所有 protobuf 消息的 ~25Hz 消息解析。

是否有更快的方法来检查 byte[] 缓冲区是否属于 protobuf 消息?

标签: c#performanceprotocol-buffers

解决方案


评论总结了这一点,但这是您无需自己向 protobuf 消息添加标识符即可检查的最快方法。此外,只有在像我在问题中记录结果时那样使用调试器运行时,性能损失才会显着。独立运行具有更好的性能。


推荐阅读