2009-03-08 2 views
1

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

Есть ли какие-либо оптимизации, которые я могу применить к своим сборкам, чтобы ускорить их загрузку без участия GAC или Ngen, и они недоступны для ClickOnce?

Это проект WinForms 2.0. Я могу обновить его до 3,5, но это ограничивает мою пользовательскую базу. У меня установлена ​​.NET Framework 3.5 на моей машине.

ответ

2

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

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

Пример:

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, потому что будет вызывать модули должны быть загружены слишком рано.

+0

GvS, у вас есть ссылки на некоторые примеры о том, как это сделать? –

+0

Это выглядит довольно мило. Но фантастический заставку не то, что я ищу. Пользователи хотят на самом деле начать использовать программу сразу, и восприятие заставки не поможет. –

+0

Я знаю, но это лучшее, что сработало для меня. Покажите обратную связь с пользователем, что все загружается, лучше, так как пользователь может ждать без обратной связи. Если пользователю нужно слишком долго ждать, он снова запустит приложение, а затем время запуска увеличится еще больше. – GvS

1

Вы можете использовать ILMerge для объединения всех ваших сборок в один файл. Чтение одного файла в память происходит быстрее, чем чтение 10 файлов. Хотя я сомневаюсь, что вы увидите реальное улучшение скорости загрузки.

Вы также можете удалить все ссылки на другие сборки, загрузить ui пользователю, а пока он использует пользовательский интерфейс (ввод или что-то еще), предварительно загрузите все необходимые сборки с помощью Assembly.Load, получите все необходимые указатели функций используя отражение и сохраняя их во внутренних членах. Таким образом, приложение будет загружаться намного быстрее. Но я не думаю, что любой здравомыслящий человек будет делать такую ​​оптимизацию.

0

Можете ли вы описать, сколько у вас сборок?

. NET загружает сборку на лету, когда вам это нужно. Вы можете разделить свое приложение на нескольких сборках. Ассембли должны быть разделены с помощью: стратегии развертывания, безопасности и производительности. Большинство приложений разделены на 3 уровня структуры (пользовательский интерфейс, бизнес, данные).

 Смежные вопросы

  • Нет связанных вопросов^_^