2010-09-28 2 views

ответ

4

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

То же самое относится к вашему конкретному приложению, хотя это, вероятно, намного меньше, чем сама инфраструктура.

Один из вариантов, чтобы попытаться перезагрузить это, - иметь небольшое приложение no-op (например, приложение WinForms, которое никогда не запускает окно), которое запускается при запуске. Конечно, это немного замедлит остальную часть вашего запуска - и если компьютер не будет запускать какие-либо .NET-приложения в течение длительного времени, среда будет изгнана из кэша в конечном итоге.

+0

как я могу это сделать: приложение WinForms, которое никогда не запускает окно. У меня теперь есть winform, и я не хочу обедать, это окно. – Ata

+0

@Ata: Просто вернитесь в метод Main без вызова 'Application.Run'. Вы можете по-прежнему * создавать * свою форму, чтобы она втягивала все соответствующие сборки - просто не запускайте цикл сообщений. –

0

Это почти наверняка связано с тем, что ОС загружает необходимые DLL-файлы, которые остаются в памяти (если только память не нужна в другом месте) после выхода приложения.

Вы можете запустить свою программу в специальном режиме, который просто загружается и выходит), чтобы эти DLL-файлы загружались, и это трюк, используемый несколькими приложениями (MS Office и OpenOffice.org - это два момента,).

Некоторые люди будут запускать свои программы при запуске, чтобы сделать их первый вызов более быстрым, но я считаю, что это должно быть предоставлено пользователю. Это их машина в конце концов. Обязательно покажите им, как они могут это сделать (например, добавьте yourprogram.exe /loadandexit в свою папку автозагрузки), но оставьте это до них.

Я, например, не хочу, чтобы каждое приложение запускалось с замедлением загрузки.

2

Первый раз, когда вы запустите приложение .NET происходит следующее:
1) Загрузка приложения, во время выполнения, и рамки с жесткого диска (который медленно) в память (которая намного быстрее)
2) Затем ваше приложение и связанные с ним библиотеки должны точно соответствовать JIT, скомпилированному на собственный код ... по мере необходимости. Этот родной код остается в памяти, а инфраструктура времени выполнения хранит запись кода, который он скомпилировал для собственного кода.
3) Только на третьем этапе этот нативный код фактически выполняется процессором.

Если вы не закрыли свой компьютер и не запустили приложение. Происходит следующее:
1) Когда время выполнения встречается с вашим управляемым кодом, который уже был скомпилирован в native компилятором JIT, он не перекомпилирует его. Он просто выполняет уже скомпилированную в памяти память.
2) Только код, который не был JIT, скомпилированный для native в первом запуске, теперь скомпилирован из управляемого в native ... и thats only if needed.

Так на втором запуске приложения две вещи получить очень быстро:
1) погрузка либо не случается вообще или его намного меньше, чем первый.
2) компиляция из управляемого на родной либо не происходит, либо ее минимальная

Вот почему ваш второй запуск приложения почти всегда быстрее, чем первый запуск.

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