Повысит ли производительность 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) коде.
Спасибо.
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