Как определить, является ли буфер сообщением Google Protocol Buffer (Protobuf) или чем-то еще, без использования исключений? - PullRequest
0 голосов
/ 03 августа 2020

TL; DR: мне нужно идентифицировать byte [] как принадлежащий сообщению protobuf или нет. Есть ли эффективный способ сделать это без блока try / catch?

Я добавляю protobuf в существующий набор сообщений для C# приложения для мониторинга сообщений. Мне нужно анализировать сообщения с частотой ~ 100 Гц, а в моем наборе сообщений около 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 ДЕЙСТВИТЕЛЬНО ухудшают мою производительность. I go от синтаксического анализа сообщений ~ 2000 Гц без сообщений protobuf до синтаксического анализа сообщений ~ 25 Гц со всеми моими сообщениями protobuf. * ​​1006 *

Есть ли более быстрый способ проверить, принадлежит ли буфер byte [] сообщению protobuf или нет?

1 Ответ

0 голосов
/ 05 августа 2020

Комментарии резюмируют это, но это самый быстрый способ проверить, не добавляя идентификаторы в сообщения protobuf самостоятельно. Кроме того, снижение производительности значимо только при запуске с отладчиком, как я, когда записывал результаты в вопросе. Работа в автономном режиме имеет гораздо лучшую производительность.

...