c# - 如何在不使用异常的情况下判断缓冲区是 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 消息?
解决方案
评论总结了这一点,但这是您无需自己向 protobuf 消息添加标识符即可检查的最快方法。此外,只有在像我在问题中记录结果时那样使用调试器运行时,性能损失才会显着。独立运行具有更好的性能。
推荐阅读
- python - 将 Anaconda 重新安装到我的用户配置文件会修复我的权限错误吗?
- sql - ORACLE SQL将多行合并为一个并对字段求和
- java - ContextRefreshed 后 Spring WebApp 中 ScheduledFutureTask 中的 RejectedExecutionException
- c - C 中释放内存的递归解决方案
- javascript - 绕过“DOMException:play() 失败,因为用户没有先与文档交互。”
- kubernetes - 有没有办法让部署或作业在 kubernetes 中完成后自动删除?
- c++ - 如何选择通用模板和函数重载?
- visual-studio-2015 - 在老师的电脑上打开项目的问题
- javascript - 如何在反应中使用 OnClick 中的回调函数
- jenkins - 更新 。Jenkins 中的 Nuspec 文件