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