Как я могу ускорить производительность первого выполнения моего приложения .NET? - PullRequest
3 голосов
/ 26 июня 2009

Наши клиентские приложения на C # всегда загружаются намного быстрее при первом запуске. Я не зашел так далеко, чтобы проверить, является ли первый запуск любого .NET-приложения более медленным или же первый запуск каждого .NET-приложения медленнее, но это остается проблемой в любом случае. Как мы можем устранить этот одноразовый удар при запуске?

Вначале я думал, что какой-то сервис может "разогреть" библиотеки. Нужно ли нам делать это для каждого из наших приложений или только для любого приложения .NET? Будет ли пользователь, который запускает службу, иметь значение? Возможно, вместо службы Windows, приложение, которое запускается при входе в Windows, может выполнить грязную работу? Опять же, будет ли достаточно того, что это сервис .NET, или нам придется запускать каждую из наших программ, чтобы устранить штраф? Мы можем передать параметр командной строки, который сообщит программе о немедленном выходе, но будет ли этого достаточно, или нам потребуется .NET для загрузки каждой сборки, которую мы будем использовать во время нормального выполнения приложения?


Re: В некоторых ответах мы развертываем библиотеки DLL в режиме релиза, и замедление происходит только при первом запуске. Мы максимально откладываем инициализацию классов.

Ответы [ 4 ]

10 голосов
/ 26 июня 2009

Это JIT (сборка Just In Time), которая позволяет вам ждать первого запуска приложений .net. Это компилирует ваш IL в машинный код перед запуском кода. Причина, по которой это происходит только в первый раз, заключается в том, что версия машинного кода затем сохраняется на диске для повторного использования.

Вы можете использовать NGEN.EXE для предварительного создания приложения ...

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

4 голосов
/ 26 июня 2009

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

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

3 голосов
/ 26 июня 2009

Чтение это (улучшение времени запуска приложения), это (оптимизация CLR в .NET Framework 3.5 SP1) и это (преимущества производительности NGen) .

Основная идея для улучшения времени запуска - использовать отложенную инициализацию, когда это возможно. Не создавайте ненужные вещи сразу после запуска. И т. Д. И т. Д.

1 голос
/ 26 июня 2009

У меня ощущение, что задержка запуска происходит из-за времени выполнения .NET, преобразующего MSIL в собственный код.

Возможно, вы можете создать свои сборки после установки, это скомпилирует их в native код и, возможно, предотвратит задержку запуска. WiX (http://wix.sourceforge.net) имеет настраиваемое действие, которое делает именно это.

...