API из приложения C ++ с лучшей производительностью - PullRequest
0 голосов
/ 06 июня 2018

При вызове функций C ++ из кода C #, какой способ дает наилучшую производительность?

  • COM-взаимодействие
  • C ++ - CLI (это будущее?)
  • HTTP REST API
  • Что-то еще?

Я полагаю, что COM-взаимодействие дает лучшую производительность, и что производительность быстро падает при переходе по списку.Или я совершенно не прав?

Справочная информация

У нас есть старое приложение для центрального сервера, написанное на C ++ / MFC.Сегодня нет других простых способов взаимодействия других приложений с этим приложением, и мы хотим разработать для него API.

В современном приложении важна производительность, и мы хотим достаточно высокую производительность даже в этих приложениях.которые используют новый API.

Приложения, которые будут использовать API, будут написаны на C ++, C # и PowerShell.Вероятно, для каждого языка должен быть сделан какой-то вид Facade, но мы не хотим, чтобы это было слишком большой работой, чтобы обновлять различные фасады с изменениями в API.Лучше всего было бы, если бы Фасады были автоматически сгенерированы при компиляции.

Редактировать

Под функциями я имею в виду функции для получения статуса, получения и установки информации ввнутренняя база данных (это могут быть длинные текстовые строки) и т. д.

1 Ответ

0 голосов
/ 06 июня 2018

См. this для получения дополнительной информации от самих Microsoft.

Кроме этого;кажется, что P / Invoke является самым быстрым (например, см. this ).Исходя из опыта, я могу сказать, что P / Invoke работает довольно быстро (75 мкс на вызов по сравнению с 1,4 мкс только для C #), но это, конечно, не универсально и YMMV.

Более того, в то время как P / Invoke довольно быстр, он совершенно небезопасен и часто просто боль в ***.То же самое касается COM Interop, так как оба испытывают недостаток всего синтаксического сахара и простоты, которые предлагает C # - и в некоторой степени C ++ / CLI -.Они также приводят к гораздо большему количеству подробного кода.

Здесь C ++ CLI пригодится.Это делает написание кода взаимодействия намного проще и безопаснее, чем с помощью P / Invoke или COM.Он также менее многословен.

Однако гораздо важнее то, что P / Invoke не работает с C ++ .Он работает только с C, так что вам всегда будет нужен хотя бы тонкий слой-обертка для вашего кода C ++ (например, extern "C", без классов и т. Д.), В то время как C ++ / CLI работает с C ++ и всеми приятными вещами, такими как std::string..


Вывод: важно не выбирать, что является самым быстрым с точки зрения времени выполнения, а скорее с точки зрения времени разработки : вы хотите потратить 8+ часов на охотуСнизить неприятную утечку памяти, вызванную не тщательно написанным P / Invoke, просто для того, чтобы получить дополнительные +10us?

Выберите, что является наиболее читабельным и наиболее безопасным, а не то, что немного быстрее, чем другие.Оптимизацию можно и нужно делать скорее в конце.

...