Вопрос

Работа в .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, бизнес, данные).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top