CLR.NET компиляция JIT каждый метод, каждый раз?

phpDocumentor может произвести в стиле, подобном документации php.net (и его встроенный и с присяжным острословом и с не разметками присяжного острослова)

26
задан Peter Mortensen 21 April 2016 в 20:24
поделиться

4 ответа

Примечание: этот ответ относится к контексту «для каждого запуска». Код обычно запускается JITT каждый раз, когда вы запускаете программу. Использование ngen или .NET Native тоже меняет эту историю ...

В отличие от HotSpot, CLR JIT всегда компилирует точно один раз за запуск. Он никогда не интерпретируется и никогда не перекомпилируется с более тяжелой оптимизацией, чем раньше, на основе фактического использования.

Это, конечно, может измениться, но так было с версии v1, и я не ожидаю, что это изменится в ближайшее время.

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

РЕДАКТИРОВАТЬ: Вышеупомянутое описывает структуру рабочего стола. Compact Framework выбрасывает собственный код, когда хочет, снова выполняя JIT при необходимости. Однако это все еще не похоже на адаптивную оптимизацию HotSpots.

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

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

РЕДАКТИРОВАТЬ: Вышеупомянутое описывает структуру рабочего стола. Compact Framework выбрасывает собственный код, когда хочет, снова выполняя JIT при необходимости. Однако это все еще не похоже на адаптивную оптимизацию HotSpots.

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

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

РЕДАКТИРОВАТЬ: Вышеупомянутое описывает структуру рабочего стола. Compact Framework выбрасывает собственный код, когда хочет, при необходимости снова JIT. Однако это все еще не похоже на адаптивную оптимизацию HotSpots.

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

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

РЕДАКТИРОВАТЬ: Вышеупомянутое описывает структуру рабочего стола. Compact Framework выбрасывает собственный код, когда хочет, при необходимости снова JIT. Однако это все еще не похоже на адаптивную оптимизацию HotSpots.

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

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

РЕДАКТИРОВАТЬ: Вышеупомянутое описывает структуру рабочего стола. Compact Framework выбрасывает собственный код, когда хочет, снова выполняя JIT при необходимости. Однако это все еще не похоже на адаптивную оптимизацию HotSpots.

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

NET может в значительной степени игнорировать боль, связанную с невозможностью встроить что-либо виртуальное.

РЕДАКТИРОВАТЬ: Вышеупомянутое описывает структуру рабочего стола. Compact Framework выбрасывает собственный код, когда хочет, при необходимости снова JIT. Однако это все еще не похоже на адаптивную оптимизацию HotSpots.

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

NET может в значительной степени игнорировать боль, связанную с невозможностью встроить что-либо виртуальное.

РЕДАКТИРОВАТЬ: Вышеупомянутое описывает структуру рабочего стола. Compact Framework выбрасывает собственный код, когда хочет, снова выполняя JIT при необходимости. Однако это все еще не похоже на адаптивную оптимизацию HotSpots.

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

Это имеет смысл для устройств с очень ограниченными возможностями. (Не могу сказать, что хорошо разбираюсь в микросхеме.)

Это имеет смысл для устройств с очень ограниченными возможностями. (Не могу сказать, что хорошо разбираюсь в микросхеме.)

44
ответ дан 28 November 2019 в 06:40
поделиться

Я не верю в это и не думаю, что когда-либо должно было быть.

Как JIT могла узнать, сколько раз будет вызываться конкретный метод? Не повлияет ли на решение частота интерпретации?

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

Как JIT могла узнать, сколько раз будет вызываться конкретный метод? Не повлияет ли на решение частота интерпретации?

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

Как JIT могла узнать, сколько раз будет вызываться конкретный метод? Не повлияет ли на решение частота интерпретации?

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

t частота интерпретации влияет на решение?

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

t частота интерпретации влияет на решение?

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

0
ответ дан 28 November 2019 в 06:40
поделиться

Среда выполнения .NET всегда компилирует код JIT перед выполнением. Таким образом, это никогда не интерпретируется.

Вы можете найти более интересное чтение в CLR Design Choices с Андерсом Хейлсбергом . Особенно часть:

Я читал, что Microsoft решила, что IL всегда будет компилироваться, а не интерпретироваться. Как информация о типе кодирования в инструкциях помогает интерпретаторам работать более эффективно?

Андерс Хейлсберг: Если интерпретатор может просто слепо делать то, что говорится в инструкциях, без необходимости отслеживать то, что находится наверху стека, он может работать быстрее. Например, когда он видит iadd, интерпретатору не нужно сначала выяснять, какой это тип добавления, он знает, что это целочисленное добавление. Предполагая, что кто-то уже убедился, что стек выглядит правильно, можно безопасно сократить время, а вам нужен переводчик. В нашем случае, однако, мы никогда не намеревались использовать интерпретируемый сценарий с помощью CLR. Мы намеревались всегда использовать JIT [своевременную компиляцию], и для целей JIT нам все равно нужно было отслеживать информацию о типе. Поскольку у нас уже есть информация о типе, это фактически ничего не дает нам, чтобы поместить ее в инструкции.

Билл Веннерс: Многие современные JVM [виртуальные машины Java] выполняют адаптивную оптимизацию, где они начинают с интерпретации байт-кодов. Они профилируют приложение во время его работы, чтобы найти от 10% до 20% кода, который выполняется от 80% до 90% времени, а затем компилируют его в нативный. Однако они не обязательно вовремя компилируют эти байт-коды. Байт-коды метода по-прежнему могут выполняться интерпретатором, поскольку они компилируются в собственный код и оптимизируются в фоновом режиме. Когда машинный код готов, он может заменить байт-коды. Не нацеливаясь на интерпретируемый сценарий, исключили ли вы полностью такой подход к выполнению в CLR?

Андерс Хейлсберг: Нет, мы не исключили этого полностью. Мы все еще можем интерпретировать. Мы просто не оптимизированы для устного перевода. Мы не оптимизированы для написания самого высокопроизводительного интерпретатора, который будет только интерпретировать. Я не думаю, что кто-то больше так делает. Для телеприставки 10 лет назад это могло быть интересно. Но это уже не интересно. JIT-технологии достигли точки, когда у вас может быть несколько возможных JIT-стратегий. Вы даже можете представить себе использование быстрой JIT, которая просто быстро копирует, а затем, когда мы обнаруживаем, что все время выполняем определенный метод, используя другую JIT, которая тратит немного больше времени и лучше справляется с оптимизацией. Вы можете сделать гораздо больше с помощью JIT.

14
ответ дан 28 November 2019 в 06:40
поделиться

Было бы неплохо увидеть в будущем JIT на основе трассировки для устройств с нехваткой памяти. В основном он будет интерпретировать, находить горячие точки, конвертировать их в ассемблер и кэшировать. Я думаю, что это то, что Google делает со своим Android JIT, а Microsoft Research ведет исследовательский проект для JIT на основе трассировки.

Я нашел статью SPUR: JIT-компилятор на основе трассировки для CIL .. Может быть, что-то из этого когда-нибудь попадет в CLR ?

3
ответ дан 28 November 2019 в 06:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: