Методы оптимизации, используемые C # и нативным C ++, сильно различаются. Компиляторы C # испускают IL, который лишь незначительно оптимизируется, а затем JIT-кодируется в двоичный код, когда он собирается выполнить в первый раз. Большая часть работы по оптимизации происходит внутри JIT-компилятора.
Это имеет свои плюсы и минусы. У JIT есть временные бюджеты, которые ограничивают то, сколько усилий он может потратить на оптимизацию. Но у него также есть глубокие знания об оборудовании, на котором он фактически работает, поэтому он (теоретически) может прозрачно использовать новые коды операций ЦП и детально знать данные о производительности, такие как база данных об опасностях конвейера.
На практике я не знаю, насколько значительным является последнее. Я знаю, что, по крайней мере, Mono автоматически распараллелит некоторые циклы, если обнаружит, что работает на ЦП с SSE (возможно, SSE2), что может иметь большое значение для вашего сценария.