Упущение определить виртуальный деструктор базового класса. Это означает, что вызов delete
на Основе* не закончит тем, что разрушил полученную часть.
Используя нерекурсивный код и, особенно, Как всегда с производительностью (и тем более при работе с управляемой средой), вы никогда не узнаете, пока не попробуете и не протестируете.
Теперь, вообще говоря, вы должны в основном писать что-то на C #, а затем оптимизировать его, оптимизировать еще немного, и если он все еще недостаточно хорош, определите точный критический фрагмент кода и перенесите его на C ++ (при этом будьте осторожны с ограничением количества границ управляемых / собственных вызовов).
Убедитесь, что вы сравниваете яблоки и яблоки.
При сортировке функция сравнения может быть доминирующей, и это может отличаться в разных реализациях.
Предполагая, что сравнение в обоих случаях выполняется достаточно быстро, чтобы не создавать проблем, тогда время может зависеть от таких вещей, как проверка границ массива, что может легко иметь большое значение.
Просто из любопытства, так как, несмотря на мой 9-летний опыт работы с .NET, я все еще постоянно совершаю эту ошибку: вы компилировали свой код в режиме Release с включенной оптимизацией? Код отладки работает значительно хуже, чем оптимизированный код выпуска.
Предполагая, что вы выполняете компиляцию в режиме выпуска, не должно быть большой разницы в производительности, если вы реализуете алгоритм аналогичным образом (т.е. Если вы хотите увидеть реализацию .NET и разобраться, вы можете загрузить SSCLI, Common Language Infrastructure с общим исходным кодом. Это общедоступная реализация интерфейса командной строки Microsoft, соответствующая стандарту ECMA. Это не 100% платформы .NET, которую мы все знаем и любим, но это значительная ее часть. Он может предоставить много информации, которую Reflector не может, включая внутренние реализации. Доступны все типы кода, включая C #, C ++ и даже в некоторых случаях ассемблер.