c # — JIT-компилятор и его преимущества для ускорения выполнения программ в .net перед переполнением стека

Как мы знаем, .net имеет CLI и JIT для выполнения программ. но эти два этапа могут привести к снижению скорости и производительности по сравнению с с ++, которые компилируют все коды за один этап. Я хочу знать, что языки .net, как преодолеть этот недостаток и справиться с ним?

1

Решение

Работая над обоими компиляторами C ++ и проведя последние несколько лет, работая над .Net JIT, я думаю, что есть несколько вещей, которые стоит рассмотреть:

  • Как отмечали многие другие, JIT работает с вашим приложением в процессе, и он старается тщательно сбалансировать быстрое время JIT и качество объединенного кода. Более сложные оптимизации, наблюдаемые в C ++, часто идут с очень высокими ценами времени компиляции, и в графике качества время компиляции против кода есть некоторые довольно острые колени.
  • Предполагается, что предустановка может несколько изменить это уравнение, так как jit выполняется заранее и может занять больше времени, но способность предоплаты расширить область оптимизации весьма ограничена (например, мы стараемся избегать введения хрупких зависимостей между сборками и, например, не будем встроенными через границы сборки). Таким образом, предопределенный код имеет тенденцию выполняться несколько медленнее, чем кодированный, и в основном помогает запускать приложения.
  • .Модель выполнения Net по умолчанию исключает многие межпроцедурные оптимизации из-за динамической загрузки классов, отражения и способности профилировщика обновлять тела методов в работающем процессе. В целом мы считаем, что производительность и архитектура приложений благодаря этим функциям стоят проблем. Но в тех случаях, когда эти функции не нужны, мы ищем способы гарантировать, что если ваше приложение не нуждается в нем, ваше приложение не будет платить за это.
  • Например, у нас есть некоторая «чистая» работа AOT в CoreRT, но, как следствие, отражение ограничено.
  • .Net Core 2.1 включает предварительный просмотр многоуровневого джитинга, который позволит нам ослабить некоторые ограничения времени джитинга — мы сможем потратить больше времени на методы джитинга, которые, как мы знаем, часто выполняются. Поэтому я ожидаю увидеть более сложные оптимизации, добавленные в JIT со временем.
  • .Net Core 2.1 также включает предварительный просмотр Hardware Intrinsics, чтобы вы могли в полной мере воспользоваться богатым набором инструкций, доступных на современном оборудовании.
  • .Net JIT пока не получает много пользы от отзывов профиля. Это то, над чем мы активно работаем над изменениями, хотя это займет время и, вероятно, будет связано с многоуровневым распределением.
  • Модель выполнения .Net в корне меняет подход к определенным оптимизациям компилятора. Например, с точки зрения компилятора многие операции, в том числе такие вещи низкого уровня, как доступ к полям, могут вызывать семантически значимые исключения (в C ++ только вызовы / throws могут вызывать исключения). И GC .Net является точным и перемещаемым, что накладывает ограничения на оптимизацию другими способами.
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]