Что подает заявку WPF запуститься медленный?

onFocus изменяет состояние и заставляет ваш компонент перерисовываться и изменять ссылки. className проверяет неправильные ссылки во время рендера. И test проверяет правильные ссылки после рендеринга.

Попробуйте позвонить test до return, внутри настройки ref и внутри события onFocus.

13
задан Dave Clemmer 29 July 2011 в 19:27
поделиться

3 ответа

Приведенный ниже текст был извлечен из этой статьи MSDN об улучшении времени запуска приложений WPF (Правка: теперь объединено с Время запуска приложения WPF )

Время запуска приложения

Время, необходимое для запуска приложения WPF, может сильно различаться. В этом разделе описываются различные методы сокращения воспринимаемого и фактического времени запуска для приложения Windows Presentation Foundation (WPF).

Общие сведения о холодном запуске и WarmStartup

Холодный запуск происходит, когда ваше приложение запускается в первый раз после перезагрузки системы, или когда вы запускаете приложение, закройте его, а затем снова запустите через долгое время. При запуске приложения, если требуемые страницы (код, статические данные, реестр и т. Д.) Отсутствуют в диспетчере памяти Windows ' s список ожидания, возникают ошибки страницы. Доступ к диску требуется для переноса страниц в память.

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

Реализация экрана-заставки

В случаях, когда существует значительная, неизбежная задержка между запуском приложения и отображением первого пользовательского интерфейса, оптимизируйте воспринимаемое время запуска с помощью заставки . При таком подходе изображение отображается практически сразу после запуска приложения пользователем. Когда приложение готово отобразить свой первый пользовательский интерфейс, заставка исчезает. Начиная с .NET Framework 3.5 SP1, вы можете использовать класс SplashScreen для реализации экрана-заставки. Для получения дополнительной информации см. Как: добавить заставку в приложение WPF .

Вы также можете реализовать свой собственный экран-заставку, используя встроенную графику Win32. Отобразите вашу реализацию до вызова метода Run .

Проанализируйте код запуска

Определите причину медленного холодного запуска. Дисковый ввод-вывод может быть ответственным, но это не всегда так. Как правило, следует минимизировать использование внешних ресурсов, таких как сеть, веб-службы или диск.

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

Запустите приложение WPF сразу после перезагрузки и определите, сколько времени потребуется для отображения. Если все последующие запуски вашего приложения (теплый запуск) выполняются намного быстрее, проблема с холодным запуском, скорее всего, вызвана вводом-выводом.

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

Оптимизация загрузки модулей

Используйте такие инструменты, как Process Explorer (Procexp.exe) и Tlist.exe, чтобы определить, какие модули загружает ваше приложение. Команда Tlist показывает все модули, загруженные процессом.

Например, если вы не подключаетесь к Интернету и видите, что загружен System.Web.dll, значит, в вашем приложении есть модуль, который ссылается на эту сборку. Убедитесь, что ссылка необходима.

Если ваше приложение имеет несколько модулей, объедините их в один модуль. Этот подход требует меньше накладных расходов на загрузку сборки CLR. Меньшее количество сборок также означает, что среда CLR поддерживает меньшее состояние.

Отложить операции инициализации

Рассмотрите возможность откладывания кода инициализации до тех пор, пока не отобразится главное окно приложения.

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

Избегайте конфигурации приложения

Рассмотрите возможность избегания приложения конфигурации. Например, если приложение имеет простые требования к конфигурации и строгое целевое время запуска, записи реестра или простой файл INI могут быть более быстрой альтернативой запуска.

Используйте GAC

Если сборка не установлена ​​в глобальном кэше сборок (GAC), возникают задержки, вызванные проверкой хэша сборок со строгими именами и проверкой образа Ngen, если на компьютере доступен образ в машинном коде для этой сборки. Проверка строгого имени пропускается для всех сборок, установленных в GAC. Для получения дополнительной информации см. Gacutil.exe (средство глобального кэша сборок) .

Используйте Ngen.exe

Рассмотрите возможность использования генератора собственных образов (Ngen.exe) в вашем приложении. Использование Ngen.exe означает торговлю потреблением ЦП для большего доступа к диску, потому что собственный образ, созданный Ngen.exe, вероятно, будет больше, чем образ MSIL.

Чтобы сократить время горячего запуска, вы всегда должны использовать Ngen.exe на вашем компьютере. применение, потому что это позволяет избежать затрат ЦП на JIT-компиляцию кода приложения.

В некоторых сценариях холодного запуска также может быть полезно использование Ngen.exe. Это потому, что JIT-компилятор (mscorjit.dll) загружать не нужно.

Наличие модулей Ngen и JIT может иметь худший эффект. Это связано с тем, что mscorjit.dll должен быть загружен, и когда JIT-компилятор работает с вашим кодом, необходимо получить доступ ко многим страницам в изображениях Ngen, когда JIT-компилятор считывает метаданные сборок.

Ngen и ClickOnce

Путь вы планируете развернуть свое приложение, это также может повлиять на время загрузки. Развертывание приложения ClickOnce не поддерживает Ngen. Если вы решите использовать Ngen.exe для своего приложения, вам придется использовать другой механизм развертывания, например, установщик Windows.

Для получения дополнительной информации см. Ngen. exe (генератор образов в машинном коде) .

Перебазирование и конфликты адресов DLL

Если вы используете Ngen.exe, имейте в виду, что перебазирование может происходить при загрузке образов в машинном коде в память. Если DLL не загружается по предпочтительному базовому адресу, потому что этот диапазон адресов уже выделен, загрузчик Windows загрузит ее по другому адресу, что может занять много времени.

Вы можете использовать дамп виртуального адреса (Vadump .exe), чтобы проверить, есть ли модули, в которых все страницы являются частными. Если это так, возможно, модуль был перебазирован на другой адрес. Следовательно, его страницы не могут быть общими.

Для получения дополнительной информации о том, как установить базовый адрес, см. Ngen.exe (генератор изображений в машинном коде) .

Оптимизировать Authenticode

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

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

Начиная с .NET Framework 3.5, существует опция конфигурации, позволяющая обойти проверку Authenticode. Для этого добавьте в файл app.exe следующий параметр. config:

<configuration>
 <runtime>
    <generatePublisherEvidence enabled="false"/>
  </runtime>
</configuration>

Сравнить производительность в Windows Vista

В диспетчере памяти в Windows Vista используется технология SuperFetch. SuperFetch анализирует закономерности использования памяти с течением времени, чтобы определить оптимальное содержимое памяти для конкретного пользователя. Он работает постоянно, чтобы поддерживать этот контент в любое время.

Этот подход отличается от метода предварительной выборки, используемого в Windows XP, который предварительно загружает данные в память без анализа шаблонов использования. Со временем, если пользователь часто использует ваше приложение WPF в Windows Vista, время холодного запуска вашего приложения может улучшиться.

Эффективное использование доменов приложений

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

Для лучшей производительности обеспечить эффективную междоменную связь за счет уменьшения количества междоменных вызовов. По возможности используйте вызовы без аргументов или с аргументами примитивного типа.

Используйте атрибут NeutralResourcesLanguage

Используйте атрибут NeutralResourcesLanguageAttribute , чтобы указать нейтральную культуру для ResourceManager . Такой подход позволяет избежать неудачных поисков сборок.

Использование класса BinaryFormatter для сериализации

Если необходимо использовать сериализацию, используйте класс BinaryFormatter вместо класса XmlSerializer . Класс BinaryFormatter реализован в библиотеке базовых классов (BCL) в сборке mscorlib.dll. XmlSerializer реализован в сборке System.Xml.dll, которая может быть дополнительной загружаемой DLL.

Если необходимо использовать класс XmlSerializer , можно добиться большей производительности, если предварительно сгенерировать сборку сериализации.

Настройте ClickOnce для проверки обновлений после запуска

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

Если вы используете модель приложения браузера XAML (XBAP), имейте в виду, что ClickOnce проверяет сайт развертывания на наличие обновлений, даже если XBAP уже находится в кэше ClickOnce. Для получения дополнительной информации см. Безопасность и развертывание ClickOnce .

Настройка службы PresentationFontCache для автоматического запуска

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

Установите привязку данных программно

Вместо использования XAML для установки DataContext ] декларативно для главного окна, рассмотрите возможность его программной установки в методе OnActivated .

18
ответ дан 1 December 2019 в 21:53
поделиться

Время запуска приложения WPF может быть намного быстрее, если вы используете Framework 3.51, а не 3.5 или 3.0. 3.51 - это действительно улучшение.

2
ответ дан 1 December 2019 в 21:53
поделиться

Из отличной статьи, на которую ссылается Стюарт, мне больше всего помог трюк с XmlSerializer. Это действительно сэкономило несколько секунд. Кроме того, не стоит недооценивать дефрагментацию HD: -)

0
ответ дан 1 December 2019 в 21:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: