GAC против JIT - PullRequest
       16

GAC против JIT

5 голосов
/ 18 марта 2009

Все ли в GAC предварительно скомпилировано (ngened)? Если это так, то все .NET предварительно скомпилированы, поэтому CLR не может оптимизировать их во время выполнения?

Например, если вы используете List в своем приложении, CLR не сможет оптимизировать сам List, а только как он будет использоваться в вашем приложении? Не противоречит ли это цели JIT, чтобы получить много оптимизаций во время выполнения? Так эффективно ли потерять все потенциальные оптимизации для BCL?

Ответы [ 4 ]

4 голосов
/ 18 марта 2009

Нет, GAC автоматически не предварительно JITted; тем не менее, GAC является предпосылкой для предварительной JIT. На самом деле, только небольшое меньшинство вещей предварительно JITted. Кроме того, что - если бы BCL был предварительно JITted, то эти оптимизации сделали бы уже выполненными с помощью NGEN, поэтому «потеря всех потенциальных оптимизаций» не проблема.

2 голосов
/ 18 марта 2009

GAC может содержать не-ngen-код (он должен содержать его, а также собственные изображения при использовании ngen, поскольку ngened-изображения не содержат всех необходимых метаданных). Для Ngen'd кода требуется, чтобы dll была установлена ​​в GAC для эффективного функционирования (технически вы можете сделать это без, но в результате проверки имени запускается полное чтение вашей dll в любом случае , что может сделать ваше время запуска хуже ).

До 3.5 sp1 компиляция ngen определенно незначительно отличалась от времени выполнения, см. в этой статье для некоторых подробностей. Я полагаю, что это все еще верно для 3.5SP1, так как эти проблемы трудно решить.

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

  1. Время запуска этих DLL значительно сокращено
    • Чтобы получить действительно большой выигрыш, хотя все dll, загруженные при запуске, должны быть сгенерированы, чтобы избежать накладных расходов на загрузку самого jit)
  2. Собственные изображения могут совместно использовать пространство памяти для нескольких процессов.
    • Довольно бессмысленно, если вы запускаете только один или два процесса.

Я предлагаю Эта статья, детализирующая некоторые изменения в 2.0 ngen , является хорошим чтением, она охватывает такие вещи, как жесткое связывание, что является большим улучшением, и ссылки на превосходную общую документацию по написанию эффективных управляемых код, хотя он страдал от ссылки rot, см. msdn Глава 5 , к которой он относится. (обратите внимание, что этот документ старый, но многие темы по-прежнему действительны)

1 голос
/ 18 марта 2009

Нет, глобальный кеш сборок предварительно не скомпилирован.

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

0 голосов
/ 18 марта 2009

Если сборка загружается из GAC, проверка строгого имени пропускается, поскольку сборка уже была проверена. Еще одним преимуществом GAC является защита файлов (только для администратора).

NGEN имеет собственное хранилище для собственных изображений. Имеет смысл использовать NGEN без предварительной сборки сборки в GAC. В таком случае загрузка сборки приведет к проверке ее подписи SN, что означает, что криптографический хэш воссоздается при каждой загрузке сборки.

Лучшая практика при использовании ngen - это также добавлять сборки в GAC.

...