Оптимизация загрузки приложений.NET
Работа на.NET дает мне хорошую производительность в целом для самого приложения, но время начальной загрузки моего приложения довольно велико. Многое из этого идет на загрузку сборок, которые трудно измерить.
Есть ли какие-либо оптимизации, которые я могу применить к своим сборкам, чтобы ускорить их загрузку без участия GAC или Ngen, и которые недоступны для ClickOnce?
Это проект WinForms 2.0. Я могу обновить его до 3.5, но это ограничивает мою базу пользователей. У меня установлен.NET Framework 3.5 на моей машине.
3 ответа
Я создал очень маленький.exe, который показывает заставку как можно скорее. После этого я все инициализирую.
JIT-компилятор загружает модули, которые вызываются из метода, который подключается. Поэтому вы должны позаботиться о том, чтобы метод, отображающий заставку, не вызывал методы в модулях, которые вы пока не хотите загружать.
Пример:
internal sealed class Startup {
// Call Startup.Run() from Program.Main to start the application
internal void Run() {
this.ShowSplash();
this.ContinueStartup();
}
private void ShowSplash() {
_splash = new Splash();
_splash.Show();
Application.DoEvents();
}
[MethodImpl(MethodImplOptions.NoInlining)]
private void ContinueStartup() {
// Do the startup here
}
}
[MethodImpl(MethodImplOptions.NoInlining)] необходим, чтобы метод ContinueStartup() не вставлялся в jit, потому что это приведет к слишком ранней загрузке модулей.
Вы можете использовать ILMerge для объединения всех ваших сборок в один файл. Чтение одного файла в память быстрее, чем чтение 10 файлов. Хотя я сомневаюсь, что вы увидите реальное улучшение скорости загрузки.
Вы также можете удалить все ссылки на другие сборки, загрузить пользовательский интерфейс и, пока он использует пользовательский интерфейс (печатать или что-то еще), предварительно загрузить все необходимые сборки с помощью Assembly.Load, получить все необходимые указатели на функции с помощью отражения и сохранить их во внутренних членах. Таким образом, приложение будет загружаться намного быстрее. Но я не думаю, что какой-либо здравомыслящий человек будет заниматься оптимизацией подобным образом
Можете ли вы описать, сколько у вас сборок?
.NET загружает сборки на лету, когда они вам нужны. Вы можете решить разделить ваше приложение на несколько сборок. Сборки должны быть разделены с помощью: стратегии развертывания, безопасности и производительности. Большинство приложений разделены на 3 уровня (UI, бизнес, данные).