Оптимизация загрузки приложений .NET
-
05-07-2019 - |
Вопрос
Работа в .NET дает мне хорошую производительность в целом для самого приложения, но время начальной загрузки моего приложения довольно велико. Многое из этого идет на загрузку сборок, которые трудно измерить. Р>
Есть ли какие-либо оптимизации, которые я могу применить к своим сборкам, чтобы ускорить их загрузку без участия GAC или Ngen, и которые недоступны для ClickOnce?
Это проект WinForms 2.0. Я могу обновить его до 3.5, но это ограничивает мою базу пользователей. У меня установлен .NET Framework 3.5 на моем компьютере.
Решение
Я создал очень маленький .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, бизнес, данные).