Мир движется к 64-битным вычислениям, несмотря на то, что в результате программы не всегда работают быстрее или производительнее по сравнению с 32-битными. Многие 32-битные программы, по разным причинам, могут работать быстрее 64-битных. Одним из таких примеров является 64-битный JIT-компилятор .NET-фреймворка. Он выполняет большую работу для того, чтобы ваша программа работала очень быстро, но сам он, увы, не настолько быстр, как хотелось бы. Это мы и собираемся исправить. Представляем x64 JIT-компилятор нового поколения, который способен компилировать 64-битный .NET код в 2 раза быстрее.
Поговорим об x64
Кажется, что 32-битные x86-компьютеры существуют уже очень давно. Это отличная архитектура, у которой есть одна большая проблема: адресное пространство 32-битных указателей ограничено 4 Гб. 64-битные компьютеры с их расширенными указателями могут адресовать практически безграничное количество данных. Когда появилась первая x64 версия Windows, RAM были относительно дорогими, поэтому 64-битные машины в большинстве случаев использовались в качестве серверов. Сейчас же архитектура x64 стала мейнстримом и компьютеры поставляются, как правило, с объемами RAM не менее 4 Гб. Даже некоторые смартфоны перешли на 64-битные процессоры, несмотря на то что имеют всего лишь 1 Гб оперативной памяти.
.NET x64 JIT был спроектирован, чтобы выдавать наиболее эффективный код во время выполнения долго работающих процессов, выполняющихся на сервере. В этом его отличие от .NET x86 JIT, который оптимизирован для наиболее быстрой компиляции IL-кода в машинный код, что обеспечивает быстрый запуск программ. Оптимизация эффективности кода зачастую оправдана для серверных приложений. Но к «серверным приложениям» относятся и веб-приложения, одним из требований для которых является наиболее быстрый старт. 64-битный JIT в текущих версиях .NET редко может похвастатьcя быстрой компиляцией IL-кода, что заставляет многих использовать другие технологии, такие как NGen или фоновый JIT.
RyuJIT спешит на помощь!
RyuWHAT? Команда .NET Code Generation сейчас работает над совершенно новым x64 компилятором с рабочим названием RyuJIT. Он работает в 2 раза быстрее текущей версии. Это означает, что время запуска скомпилированных им программ уменьшается примерно на 30% (время потраченное на JIT-компиляцию – это только часть процесса выполнения приложений, поэтому то, что JIT работает в 2 раза быстрее, не означает, что приложение тоже должно ускориться так же). Кроме того, новый JIT все так же выдает максимально производительный машинный код.
На графике ниже представлено то, насколько RyuJIT работает быстрее текущего JIT64:
Очевидно, все примеры сработали быстрее c новым JIT. Вы наверное заметили, что второй пример (RFC822 e-mail RegEx) буквально зашел за границу графика. Это объясняется тем, что регулярные выражения работают особенно плохо на JIT64. Компиляция этого примера JIT64-компилятором заняла 60 секунд и потребовало 1.4 Гб памяти. В случае с RyuJIT потребовалось всего лишь 1.8 секунд и 199 Мб.
Пример с Paint.NET вышел более номальным. Запуск приложения на тестовой машине сократился с 2.3 до 1.8 секунд. Время затраченное на компиляцию сократилось 1510 мс до 970 мс. Думаю, понятно, что быстрый запуск с минимальным использованием памяти делает наш мир лучше.
И на десерт…
Улучшенная производительность и сокращение используемых ресурсов RyuJIT это конечно здорово, но это не самое восхитительное в нем. Когда JIT64 только разрабатывался, мы решили взять основу оптимизации команд из компилятора C++ вместо существующего тогда 32-битного JIT-компилятора, который был лучше оптимизирован для сценариев динамической компиляции. Большинство 64-битных компьютеров тогда использовались в качестве серверов, поэтому было важно сделать акцент на качестве компилируемого кода вместо улучшения производительности самого компилятора. И в результате команде .NET CodeGen пришлось поддерживать код для двух разных компиляторов. Добавлений фич и исправление багов в двух местах тормозило внедрение нововведений. А добавление ARM-архитектуры и MDIL для Windows Phone 8.0 в последние годы сделало эту работу еще труднее.
RyuJIT основан на кодовой базе x86 JIT. Пока он работает только для 64-битной архитектуры. Этот модернизированный компилятор в дальнейшем станет основой для всех наших JIT-компиляторов: x86, ARM, MDIL и возможно чего-то еще. Общая кодовая база означает, что .NET-приложения будут работать максимально схоже на разных платформах, проще говоря, баги будут одинаковы на разных архитектурах. Однако, это еще означает, что мы сможем внедрять новые технологии намного быстрее.
Что нужно сделать чтобы попробовать его?
CTP-версия RyuJIT доступна и прямо сейчас вы можете попробовать ее в вашем тестовом окружении. Поддержки для продакшена пока что нет.
Загрузить установщик RyuJIT можно уже сейчас, но работает он только на 64-битных версиях Windows 8.1 и Windows Server 2012 R2. Заметьте, что RyuJIT не вносит изменения в NGen на вашей системе – мы хотели, чтобы установка была чистой. И еще, после включения RyuJIT, во время написания кода “Edit & Continue” в VS перестанет работать для x64.
После установки, есть два способа включить RyuJIT. Если вы хотите включить его только для одного определенного приложения, добавьте переменную среды “COMPLUS_AltJit=*”. Если же хотите включить его для всех приложений, то нужно определить ключ в реестре “HKLMSOFTWAREMicrosoft.NETFrameworkAltJit” строкой “*”. Оба этих способа заставляют 64-битную CLR использовать RyuJIT вместо JIT64. К тому же, оба этих способа обратимы – установка RyuJIT не меняет ничего на вашем компьютере (кроме размещения файлов в директории компилятора).
Источник: .NET Framework Blog
Блог команды .NET Code Generation
Автор: 1tone