Повысит ли производительность C++/CLI + C++ Native? [закрытый]



В нашем проекте мы имеем три модуля. C++ (Native), C++ / CLI, C#. Мы используем C++/CLI для использования C++(Native) кода в C#. Для этого мы статически связываем C++(Native) с C++/CLI, и теперь мы можем использовать управляемую dll C++/CLI с C#.



Теперь код на C++(Native) - это простые математические алгоритмы (без Win32, без взаимодействия с ОС). Когда я свяжу статический lib с C++ / CLI, он не станет управляемым кодом? Значит, он не попадет под CLR.



Использует ли c++(Native) статический lib с C++/CLI в C# повышает мою производительность? Я не могу добиться написания кода в самом C#, а не в машинном коде.



Пожалуйста, обратите внимание,что мы широко использовали алгоритмы, контейнеры и итераторы стандартной библиотеки C++ в нашем C++(Native) коде.



Спасибо.

626   1  

1 ответ:

Когда я свяжу статический lib с C++ / CLI, он не станет управляемым кодом? Значит, он не попадет под CLR.

Нет, не обязательно. В C++ / CLI все управляемые типы будут скомпилированы в MSIL, и код будет выполняться в среде CLR. Собственные типы компилируются либо в MSIL, либо в машинный код, в зависимости от параметров компилятора :

  • параметр /clr генерирует смесь машинного и управляемого кода.
  • опция /clr:pure генерирует управляемая сборка, которая может содержать собственные типы, скомпилированные в MSIL. Это работает в основном как код C#, скомпилированный с параметром /unsafe.
  • параметр /clr:safe создает управляемую сборку, которая не содержит собственного кода. Это работает в основном как код C#, скомпилированный без опции /unsafe.

Повышает ли мою производительность использование C++(Native) static lib с C++/CLI в C#? Не могу ли я добиться написания кода на самом C#, а не на родном языке код.

Как и все вопросы оптимизации, ответ заключается в том, что это зависит. С одной стороны, машинный код часто быстрее управляемого и может быть более высоко оптимизирован (например, с использованием SIMD). С другой стороны, существует хит производительности, связанный со сборками со смешанным режимом. Реализация взаимодействия C++ обычно довольно быстра (конечно, намного быстрее, чем P/Invoke из C#), но если выгоды, которые вы получаете от компиляции в машинный код, недостаточно существенны, это может быть все равно не стоит того. Единственный способ действительно узнать-это проверить оба варианта.

Управляемый код часто получает плохую оценку, особенно от опытных программистов C++, но правда в том, что хорошо написанный код C# может быть таким же быстрым, если не быстрее, чем эквивалентный родной код C++. Это также намного легче выстрелить себе в ногу в C++, поэтому если у вас есть команда разработчиков, которые являются экспертами C# и не обязательно экспертами C++, вы, вероятно, закончите плохо написанным и медленным Код C++. Наконец, когда остальная часть вашего проекта находится в C#, снижение затрат на обслуживание может означать, что дажеаналогичная производительность приемлема.

Comments

    Ничего не найдено.