1

Я считаю, что .NET Framework оптимизирует определенные двоичные файлы, ориентированные на функции, специфичные для компьютера, на котором он установлен.

После замены процессора с Intel Nehalem на чип Haswell следует ли снова запускать оптимизацию вручную? Если так, каков процесс для этого?

Между поколениями есть несколько заметных дополнений:

Так что мой, хотя и наивный, мыслительный процесс состоял в том, что оптимизация может использовать их в общих случаях. Например, возможно, при вызовах библиотеки Random можно использовать аппаратный RNG на Ivy Bridge и более поздних моделях.

1 ответ1

4

Короткий ответ

Это не нужно, как сейчас.

Длинный ответ

Код , который нацелен на .NET Framework Common Language Runtime (CLR) известен как управляемый код, и код , который не известен как неуправляемый.

При компиляции в управляемый код компилятор переводит ваш исходный код на промежуточный язык Microsoft (MSIL), который представляет собой независимый от процессора набор инструкций, которые можно эффективно преобразовать в собственный код.

Прежде чем вы сможете запустить промежуточный язык Microsoft (MSIL), он должен быть скомпилирован в соответствии с общеязыковой средой исполнения в собственный код для архитектуры целевой машины. .NET Framework предоставляет два способа выполнить это преобразование:

Источник: Процесс управляемого исполнения

JIT сборник

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

Источник: Процесс управляемого исполнения

Хотя теоретически JIT-компилятор мог бы использовать в своих интересах инструкции для конкретного процессора, такие как AES или AVX, такие оптимизации еще не были реализованы. Полная поддержка AVX, вероятно, появится позже с новой версией среды выполнения .NET, которая включает RyuJIT, JIT-компилятор следующего поколения, который находится в стадии разработки.

Родные изображения

[Native Image Generator (Ngen.exe) - это инструмент, который выполняет преждевременную компиляцию [из] сборок MSIL в нативный код, как это делает JIT-компилятор. Однако работа Ngen.exe отличается от работы компилятора JIT тремя способами:

  • Он выполняет преобразование из MSIL в собственный код перед запуском приложения, а не во время его работы.

  • Он компилирует всю сборку за раз вместо одного метода за раз.

  • Он сохраняет сгенерированный код в Nache Image Cache в виде файла на диске.

Источник: Процесс управляемого исполнения

При использовании ngen.exe для создания собственных образов выходные данные зависят от нескольких факторов, таких как идентичность сборок и версия платформы. До версии 1.1 .NET Framework выходные данные также зависели от процессора:

Если вы обновите процессор компьютера до нового семейства процессоров, все собственные изображения, хранящиеся в собственном кэше изображений, станут недействительными.

Источник: Native.exe Generator (Ngen.exe) Устаревший синтаксис

Начиная с версии 2.0, некоторые причины недействительности образа (включая тип процессора) были устранены. Кроме того, был добавлен новый переключатель /update для повторного создания недопустимых изображений. Цитирую запись в блоге, написанную Дэвидом Нотарио (выделено мной):

В предыдущих версиях CLR (1.0 и 1.1) мы относились к компиляции NGEN так же, как и к JIT-компиляции, т. Е. Учитывая, что мы компилируем на целевой машине, мы должны этим воспользоваться. Однако в Whidbey [Visual Studio 2005] это не так. Мы предполагаем набор инструкций PPro и генерируем код, как если бы он предназначался для P4. Почему это? Было несколько причин:

  • Повысить предсказуемость повторных сборок .NET (облегчает жизнь нашей поддержки).

  • OEM-производителям и другим крупным клиентам требовался один образ для каждой платформы (для обслуживания, сборки и управления).

У нас могла бы быть опция командной строки для генерирования специфичного для платформы кода в ngen , но, учитывая, что ngen главным образом должен обеспечивать лучшее поведение рабочего набора и что эта дополнительная опция усложнила бы некоторые другие сценарии, мы решили не использовать ее.

Источник: Использует ли JIT преимущества моего процессора?

В Windows 8 и более поздних версиях .NET Framework может автоматически генерировать и поддерживать собственные образы в зависимости от использования. Задача Native Image будет выполнять всю работу в фоновом режиме, когда это необходимо, и нет необходимости в ручном вмешательстве.

дальнейшее чтение

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .