Каковы преимущества и недостатки предварительных сборок в .NET? - PullRequest
6 голосов
/ 28 января 2011

Каковы преимущества и недостатки предварительных сборок в .NET?

Я слышал, что предварительное соединение улучшит производительность.Когда я должен делать предварительный удар, а когда не должен делать предварительный удар?

Ответы [ 6 ]

6 голосов
/ 28 января 2011

«Пре-джиттинг» или прекомпиляция улучшат производительность, при запуске , потому что вы пропустите этот шаг.Причина .NET JIT при каждой загрузке приложения и его библиотек заключается в том, что оно может работать на многих платформах и архитектурах с наилучшей возможной оптимизацией без необходимости управления сборками.

Таким образом, вы должны взвесить, стоит ли головной боли администратора экономить несколько секунд при запуске приложения и загрузке библиотеки.Я думаю, что наиболее распространенный вариант использования для этого - установка серверов, когда вы склонны управлять несколькими компьютерами, а среда очень стабильна.Например, вы не будете предварительно компилировать клиентские приложения, потому что целевые среды гораздо менее предсказуемы.

4 голосов
/ 28 января 2011

«PRE-JIT» выполняется через NGen (процесс прекомпиляции из CIL в собственное изображение).Он преобразует скомпилированный код .NET из независимого от платформы промежуточного состояния в специфическую для платформы стадию.Говоря простым языком, он преобразует .NET-приложение, которое может работать как в Windows, Mac, так и в Linux, в 32-разрядной и 64-разрядной версиях, в EXE-файл старой школы, который может работать только на одном из них.

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

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

Я бы порекомендовал запустить его.NGen после установки , а не перед распространением, чтобы вы знали, что приложение будет работать на целевом компьютере.

4 голосов
/ 28 января 2011

Вы говорите о NGen для генерации сборочных образов перед выполнением? Pre-JIT является противоречием в терминах, так как «JIT» означает «точно в срок», как и непосредственно перед исполнением. Если вы что-то прекомпилируете, это, по определению, , а не JIT-ing.

Преимущество заключается в том, что у вас нет начальной задержки компиляции, которую JITter может ввести, когда сборка или тип загружаются впервые в коде. Для чрезвычайно (вероятно неразумно ) крупных сборок / типов это может быть значительным.

К недостаткам относятся такие вещи, как невозможность оптимизировать некоторые вещи, которые могут быть определены только на основе условий выполнения и того факта, что вам необходимо поддерживать образ. Кроме того, все приложения и сборки, использующие предварительно созданные образы (начиная с .NET 4), требуют полного доверия, а CAS игнорируется.

Для получения дополнительной информации о NGen см. http://msdn.microsoft.com/en-us/library/6t9t5wcf.aspx

2 голосов
/ 28 января 2011

Улучшает время запуска вашей программы. Горячий запуск - это тот случай, когда данные сборки уже находятся в кэше файловой системы, поэтому дисковод не тратит время на поиск DLL на диске. В отличие от холодного запуска, который вы получите, когда сборка никогда не загружалась ранее или была загружена давно, дисковод должен сначала найти файл. Который медленный. Вы почти всегда заботитесь о времени холодного старта, потому что это то, что так заметно для пользователя.

В чем дело, ngen.exe создает файл extra , который должен быть найден диском. Тот, который содержит предустановленный машинный код (.ni.dll). Возможно замедление холодного старта. Для «маленьких» сборок, на самом деле, имеет смысл позволить JIT-компилятору выполнять джит кода, потому что это может занять меньше времени, чем требуется дисководу для поиска предустановленной DLL. То, что именно является «маленьким», точка безубыточности, во многом зависит от того, насколько быстро диск может искать и его состояние фрагментации. Вам придется экспериментировать, но имейте в виду, что это не будет хорошо повторяться на другой машине. И что подобные эксперименты сами по себе трудны, у вас легко получится теплое начало.

0 голосов
/ 02 октября 2014

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

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

0 голосов
/ 28 января 2011

Когда вы говорите «pre-jitting», вы, вероятно, подразумеваете использование ngen.exe для предварительной компиляции сборок?

Использование ngen.exe не имеет реальных недостатков (за исключением некоторых дополнительных байтов использования диска),Однако для его использования сборки, которые вы хотите предварительно скомпилировать, должны быть расположены в GAC (глобальный кэш сборок).Тем не менее, вам понадобятся права администратора, чтобы получить их там.Таким образом, он не подходит для приложений, которые вы хотите очень легко развернуть с помощью Copy & Paste.

Да, использование ngen.exe может снизить производительность приложения (даже во время выполнения, так как некоторые оптимизации пропускаются во время JIT-компиляции для сохранения компиляциивремя).Поэтому используйте ngen всегда, когда это возможно, особенно для долго работающих приложений и приложений, которые вы действительно хотите установить локально

...