Я использую API TIBCO RV .NET (TIBCO.Rendezvous.dll).
Знаете ли вы, есть ли лучший способ с точки зрения производительности получать и читать сообщения из в C# канала RV? Я обнаружил, что тип Message - логическая оболочка для сообщения RV - довольно тяжелый. Получение поля по имени или по индексу может быть довольно медленным, особенно если рассматривать это как повторяющуюся / высокочастотную операцию.
Любые идеи?





Основная проблема с оболочкой C# заключается в том, что она:
Эти аспекты уменьшат накладные расходы на поиск на основе базового поля / имени, чего можно избежать, если вы знаете, что вам нужно просмотреть каждое поле в сообщении, перебирая поля по порядку. Это быстро в C / C++, так как он работает линейно через память и, таким образом, удобен для кеширования.
Лично мы обернули C++ api напрямую в C++ CLI (в то время библиотека .net была некачественного качества). Это сложно сделать правильно (особенно если у вас несколько доменов приложений), но дает почти такую же производительность, что и C++ api (который является невероятно тонкой оболочкой для C api).
Если ваше профилирование говорит вам, что распределения в доступе к сообщениям не позволяют вашему приложению работать с нужной / желаемой скоростью, я боюсь, что у вас возникнут проблемы с библиотекой .net. Вы можете использовать отражение, чтобы получить от базового IntPtr к собственному сообщению, а затем использовать те же самые внешние определенные функции в MessageToolbaox (внутренний класс в dll), которые переходят к собственному api, стоимость доступа к внутреннему полю один раз за сообщение может быть компенсировано более быстрым поиском поля. Это явно хрупко и сложно поддерживать, но если вы обнаружите, что оно того стоит, по сравнению с повторной реализацией их оболочки полностью, это может помочь.
Я видел то же самое. По моему опыту, доступ к полям в сообщениях C# Rv очень медленный по сравнению с доступом к ним в C++. Таким образом, вы не хотите добавлять и читать несколько полей в сообщении и из него.
Одно из решений - не использовать собственную сериализацию сообщений Rv. То есть не добавляйте много полей с помощью Message.AddField () и не получайте их с помощью Message.GetField (). Вместо этого вы можете сериализовать свои данные в непрозрачный тип (который является двоичным буфером, то есть массивом байтов). Затем вы можете добавить это единственное поле в сообщение.
Если все, что вы делаете, это чтение и запись в одно поле, накладных расходов будет очень мало. И вы сможете довольно быстро сериализовать и десериализовать данные в собственном коде.