.NET не является супер-супер-медленным, но и не находится в той же сфере, что и родной язык. Разница в скорости - это то, что вы можете легко поглотить для бизнес-приложения, которое предпочитает безопасность и более короткие циклы разработки. Если вы не используете каждый цикл на процессоре, то не имеет значения, сколько вы используете, и дело в том, что многим или даже большинству приложений просто не нужна такая производительность. Однако, когда вам нужно нужна такая производительность, .NET не предложит ее.
Что еще более важно, этого недостаточно управляемый . В C ++ вы уничтожаете каждый ресурс, управляете каждым размещением. Это большая нагрузка, когда вы действительно не хотите этого делать, но когда вам нужна дополнительная производительность тонкой настройки каждого распределения, победить невозможно.
Еще одна вещь, которую следует учитывать, - это компилятор. Я имею в виду, что JIT имеет доступ к дополнительной информации о программе и целевом процессоре. Тем не менее, действительно должен каждый раз перекомпилироваться с нуля и делать это при гораздо больших временных ограничениях, чем компилятор C ++, что по своей сути ограничивает возможности. Семантика CLR, например, выделение кучи для каждого объекта каждый раз, также существенно ограничивает его производительность. Управляемое выделение GC достаточно быстрое, но не требует выделения стека и, что более важно, отмены выделения.
Редактировать: Конечно, тот факт, что .NET поставляется с другой парадигмой управления памятью для (большинства) родных языков, означает, что для приложения, для которого сборка мусора особенно подходит, код .NET может работать быстрее, чем собственный код. Это, однако, не имеет ничего общего с управляемым кодом по сравнению с собственным кодом, просто выбирая правильный алгоритм для правильной работы, и это не значит, что эквивалентный алгоритм GC, используемый из собственного кода, не будет быстрее.