Как добиться лучших результатов, используя TIBCO RV из C #? - PullRequest
0 голосов
/ 08 января 2009

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

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

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 24 февраля 2009

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

  • Распределяет для любого доступа к полю (API c / C ++ предоставляет быстрые средства доступа со строгой типизацией для наиболее вероятных примитивов
  • помечает ссылки при каждом доступе к полям (вам не нужно делать это, если вы не планируете впоследствии обновлять поля и хотите избежать утечки памяти)
  • поиск полей по имени требует преобразования строки в строку ascii стиля c

Эти аспекты уменьшат накладные расходы на базовый поиск на основе поля / имени, чего самих можно избежать, если вы знаете, что вам нужно просмотреть каждое поле в сообщении, просматривая поля по порядку. Это быстро в C / C ++, так как он работает линейно через память и, таким образом, дружествен к кешу.

Лично мы обернули API C ++ напрямую CLI C ++ (в то время библиотека .net была нестандартного качества). Это сложно понять правильно (особенно если у вас несколько доменов приложений), но дает почти такую ​​же производительность, как API C ++ (который является невероятно тонкой оболочкой для API C).

Если ваше профилирование говорит вам, что выделения в доступе к сообщениям мешают вашему приложению работать со скоростью, которая вам нужна / нужна, я боюсь, у вас возникнут проблемы с библиотекой .net. Вы можете использовать отражение, чтобы получить базовый IntPtr для собственного сообщения, а затем использовать те же самые внешние функции в MessageToolbaox (внутренний класс в dll), которые переходят к собственному API, стоимость доступа к внутреннему полю один раз за сообщение может быть смещено более быстрым поиском поля. Это очевидно хрупко и трудно поддерживать, но если вы обнаружите, что оно того стоит, по сравнению с полной реализацией их оболочки, это может помочь.

1 голос
/ 20 декабря 2011

Я видел то же самое. Из моего опыта, доступ к полям в сообщениях C # Rv очень медленный по сравнению с доступом к ним в C ++. Таким образом, вы хотите избежать добавления и чтения нескольких полей в сообщение и из него.

Одним из решений является не использовать собственную сериализацию сообщений Rv. То есть не добавляйте много полей с помощью Message.AddField () и не получайте их с помощью Message.GetField (). Вместо этого вы можете сериализовать ваши данные в непрозрачный тип (который является двоичным буфером, то есть байтовым массивом). Затем вы можете добавить это единственное поле к сообщению.

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

...