Подтвердить что ты не робот

Оптимизирует ли .NET CLR для текущего процессора

Когда я читал о производительности JIT-языков, таких как С# или Java, авторы обычно говорят, что они должны/могли бы теоретически превосходить многие скомпилированные приложения. Теория состоит в том, что родные приложения обычно просто компилируются для семейства процессоров (например, x86), поэтому компилятор не может выполнить определенные оптимизации, поскольку они могут быть не оптимизированы для всех процессоров. С другой стороны, CLR может выполнять оптимизацию, зависящую от процессора, в процессе JIT.

Кто-нибудь знает, действительно ли Microsoft (или Mono) CLR выполняет оптимизацию, зависящую от процессора, во время процесса JIT? Если да, то какие оптимизации?

4b9b3361

Ответ 1

С 2005 года Дэвид Нотарио перечисляет несколько конкретных целевых оптимизаций, это его запись в блоге " Использует ли JIT мой процессор?". Я ничего не могу найти о новом CLR 4, но я предполагаю, что несколько новых элементов включены.

Ответ 2

Одна оптимизированная для процессора оптимизация, которую я знаю о том, что сделано в Mono, заключается в компиляции Mono.Simd вызовов вплоть до инструкций SSE для процессоров, поддерживающих SSE, Если процессор, работающий с кодом, не поддерживает SSE, компилятор JIT выдаст эквивалентный код без SSE.

Ответ 3

32-разрядные и 64-разрядные Jitters отличаются друг от друга, это начало.

Ответ 4

.Net Framework Runtime Optimization Service оптимизирует не только проблемы программирования (оптимизацию компилятора), но и процессоры.

Ответ 5

Я укажу, что основная причина, по которой я слышу, что потенциал JIT-компилированных языков превосходит статически скомпилированные языки, не имеет ничего общего с конкретными инструкциями процессора. Вместо этого он может использовать информацию о динамическом состоянии программы для оптимизации путей кода. Например, встроенное кэширование можно использовать для того, чтобы вызовы виртуальных методов были примерно такими же быстрыми, как вызовы не виртуальных методов. Примерно это работает, предполагая, что на определенном сайте вызова метод вызывается только на одном типе и испускает код, который переходит непосредственно к этой реализации (а затем переписывает код, если это предположение не появилось позже).

Ответ 6

Я думаю, что некоторые компиляторы Java делают, Microsoft.NET этого не делает, и он только бьет прекомпилированные, когда вы сравниваете яблоки с апельсинами. Precompiled может поставляться с вариантами библиотеки, настроенными на разные процессоры (или, более вероятно, разные наборы инструкций), и проверка времени выполнения, чтобы выбрать, какая библиотека для загрузки намного дешевле, чем JIT. Например, mplayer делает это (google для mplayer enable-runtime-cpudetection).

Ответ 7

Я знаю правила изменения или изменения встроенных функций в зависимости от типа процессора (x86, x64). И, конечно, размеры указателей будут меняться в зависимости от того, будет ли он работать как 32-разрядный или 64-разрядный.