Как повысить производительность с помощью TIBCO RV из C#?

Я использую API TIBCO RV .NET (TIBCO.Rendezvous.dll).

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

Любые идеи?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
3 332
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Основная проблема с оболочкой C# заключается в том, что она:

  • Выделяет для любого доступа к полю (c / C++ api предоставляет строго типизированные быстрые средства доступа для наиболее вероятных примитивов
  • отмечает ссылки при каждом доступе к полю (вам не нужно этого делать, если вы не планируете впоследствии обновлять поля и хотите избежать утечки памяти)
  • поиск полей по имени требует преобразования строки в строку ascii в стиле 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 (). Вместо этого вы можете сериализовать свои данные в непрозрачный тип (который является двоичным буфером, то есть массивом байтов). Затем вы можете добавить это единственное поле в сообщение.

Если все, что вы делаете, это чтение и запись в одно поле, накладных расходов будет очень мало. И вы сможете довольно быстро сериализовать и десериализовать данные в собственном коде.

Другие вопросы по теме