Соединение уровня C ++ / CLI - это процесс маршаллинга, когда управляемое состояние преобразуется в примитивные типы, чтобы маршалировать на неуправляемый уровень, обрабатывать, а затем маршалировать обратно. В зависимости от вашего алгоритма (и прагматики для «обертывания» этого переходного слоя) лучше всего поддерживать сортировку как можно более ограниченной (малой).
Таким образом, это зависит от проблемы: самая простая проблема - это интерфейс, который отправляет немного примитивных данных через уровень C ++ / CLI, обрабатывает LONG время, а затем отправляет немного данных обратно (например, минимальные издержки на маршаллинг) , Если ваш алгоритм требует более обширного взаимодействия на уровне C ++ / CLI, он становится намного сложнее.
Преимущество "All C #" или "All Managed" состоит в том, что (1) пропускает этот уровень сортировки (который является накладным, а иногда утомительным в зависимости от работы), и (2) оптимизация времени выполнения, что движок .NET может сделать для конкретного компьютера, на котором выполняется код (который вы не можете иметь с собственным C / C ++ или неуправляемым кодом).
Я согласен с другими комментариями в этой теме, что вы должны / должны "протестировать" его в соответствии со своими сценариями. «Большой» слой C ++ / CLI с чувствительным к производительности переходом очень сложен из-за «упаковки / распаковки», которая (автоматически) происходит, когда вы продолжаете переходить между управляемым / неуправляемым.
Наконец, предельная предельная разница в производительности между гибридным «управляемым / неуправляемым» дизайном и «полностью управляемым» дизайном связана с компромиссами между: Может ли ядро .NET выполнять специфичные для машины оптимизации кода .NET (например, используя преимущества машинно-ориентированных потоков / ядер / регистров), больший, чем «чистый нативный» код (который связан со сборкой смешанного режима), способен обрабатывать FAST, минуя. NET движок (который является переводчиком)?
Правда, хорошо написанный собственный код может «обнаруживать» потоки процессора, но, как правило, не может обнаруживать машинно-зависимые регистры (если они не скомпилированы для этой целевой платформы). Напротив, у нативного кода нет «накладных расходов» на прохождение среды выполнения .NET, которая представляет собой просто виртуальную машину (которая может быть «ускорена» за счет компиляции Just-In-Time некоторой логики для ее конкретного базового оборудования).
Сложная проблема. Сожалею. ИМХО, просто нет простых ответов на этот тип проблемы, если ваша проблема связана с «чувствительностью к производительности».