На этот вопрос нет единого ответа.Как правило, общее , нативный код обычно будет быстрее, но 1) это не всегда так, 2) иногда разница слишком мала, и 3) насколько хорошо написан кодобычно имеет большее значение, чем управляемый и неуправляемый.
Управляемый код выполняется на виртуальной машине.По сути, вы начинаете с компилятора, который генерирует байтовые коды в качестве вывода, а затем передаете его на виртуальную машину.Затем виртуальная машина повторно компилирует ее в машинный код и выполняет ее.Это может обеспечить некоторые реальные преимущества при некоторых обстоятельствах.Например, если у вас есть 64-разрядный процессор, работающий на 64-разрядной виртуальной машине (почти что вполне достаточно), но старая программа, написанная до появления 64-разрядных процессоров, виртуальная машина все равно скомпилирует этот байт-код в 64-битовый машинный код, который может дать довольно существенное преимущество в скорости по крайней мере для некоторого кода.
В то же время это может быть довольно заметным недостатком для некоторого кода.В частности, компилятор работает, пока пользователь ждет.Для этого компилятор виртуальной машины не может работать очень медленно.Хотя генераторы собственного кода различаются, вполне вероятно, что любой выбранный вами компилятор будет включать, по крайней мере, несколько оптимизаций, которые были исключены из компилятора байт-кода виртуальной машины, чтобы сохранить разумное использование ресурсов.
Виртуальная машина также использует мусорколлектор.Сборщики мусора имеют довольно отличные характеристики от ручного управления памятью.Со многими ручными менеджерами выделение памяти довольно дорого.Освобождение памяти довольно дешево, но примерно линейно по количеству выпущенных вами предметов.Другие ручные менеджеры примерно обращают на это внимание, выполняя дополнительную работу при освобождении памяти, чтобы ускорить распределение.В любом случае, структура затрат отличается от типичного сборщика.
При сборщике мусора выделение памяти обычно очень дешево.При обычном (копирующем) сборщике стоимость освобождения памяти зависит, прежде всего, от количества объектов, которые были выделены и все еще (по крайней мере, потенциально) используются.
Хотя сами распределения также различаются.В нативном C ++ вы обычно создаете большинство объектов в стеке, где выделение памяти и чрезвычайно дешево.В управляемом коде вы, как правило, выделяете гораздо больший процент памяти динамически, где собирается мусор.