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