Поделиться через


Повышение производительности приложения путем уменьшения использования памяти и дискового пространства

В этом руководстве показано, как повысить производительность приложения Windows двумя основными способами:

Минимизация использования памяти

Существует множество способов свести к минимуму объем памяти, используемой приложением Для Windows, можно:

  • Сокращение использования памяти переднего плана
  • Свести к минимуму фоновую работу
  • Выпуск ресурсов в фоновом режиме
  • Убедитесь, что приложение не вызывает утечку памяти

Чтобы свести к минимуму использование памяти, сначала важно понимать следующее:

Как только у вас будет системная трассировка для анализа, мы порекомендуем рекомендации по применению вашего анализа трассировки для уменьшения использования памяти.

Рабочий набор, динамическая память и виртуальное выделение

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

Объем памяти, используемой приложением, влияет на производительность среды выполнения, а также скорость реагирования системы в целом. Минимизация использования памяти поможет приложению повысить производительность, сокращая затраты на ЦП, связанные с доступом к большему объему памяти. Уменьшенное использование памяти также помогает на отзывчивость системы и улучшает общее взаимодействие пользователя с приложением, так как приложение не вытесняет другое содержимое памяти.

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

Существует два ключевых фрагмента памяти, используемой приложением: 1) динамическая память и 2) файловая резервная память. Использование файловой памяти происходит из двоичных файлов и файлов данных, таких как базы данных, используемые приложением. Это обычно не является значительным фрагментом использования памяти приложения и часто константой. (Исключения — это приложения обработки данных, компиляция кода и т. д.) Более значительный источник использования памяти и место утечки манифеста — динамическая память.

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

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

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

Запись системной трассировки для анализа использования памяти

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

Трассы могут отличаться по длине:

  • Для записи запуска приложения можно использовать короткую трассировку. Это может включать переход вашего приложения в неактивное состояние, при котором его окно/окна свернуты или закрыты, в то время как процесс приложения продолжается.
  • Продолжительная трассировка, обычно длительностью несколько минут, полезна при диагностике утечек памяти. Если использование памяти продолжается с течением времени, это обычно предполагает утечку.

Существует несколько средств для мониторинга использования памяти, в том числе:

В этой статье мы сосредоточимся на использовании анализатора производительности Windows. Дополнительные сведения о выборе средства профилирования производительности приложения см. в статье "Выбор среди профилировщика производительности Visual Studio", Набора средств производительности Windows и PerfView.

Чтобы записать трассировку:

  1. Откройте командную строку (PowerShell или командную строку) в режиме администратора. (Если не запустить в режиме администратора, может появиться код ошибки: 0xc5585011, "Не удалось включить политику для профилирования производительности системы.")

  2. Введите команду : wpr -start VirtualAllocation -filemode

  3. Запустите сценарий, который вы изучаете. (Например, запуск приложения.)

  4. Введите команду : wpr -stop Trace.etl

Анализ трассировки системы

Чтобы найти, какая из функций приложения имеет выделенную память, которую можно уменьшить, теперь необходимо проанализировать системную трассировку, которая была записана. Чтобы проанализировать трассировку, выполните следующие действия.

  1. Откройте трассировку с помощью анализатора производительности Windows, введя команду: wpa.exe Trace.etl

  2. В окне Graph Explorer активируйте раздел Память, щелкните правой кнопкой мыши на графике Total Commit и выберите Добавить график в новое представление анализа.

  3. Откройте редактор представления, щелкнув шестерёнку "Параметры" и выбрав следующее расположение столбцов: Процесс, Тип фиксации, Стек фиксаций и Размер.

  4. Щелкните заголовок столбца Size , чтобы результаты были отсортированы в порядке убывания. Стек фиксации показывает путь кода, ведущий к выделению памяти. Эти результаты могут помочь понять причину выделения. Сортировка по размеру позволяет сосредоточиться на более крупных распределениях и определить, есть ли возможность для оптимизации.

  5. Отфильтруйте нужные процессы, щелкнув процесс правой кнопкой мыши и выбрав фильтр для выбора.

  6. Чтобы увеличить изображение интересующего региона в области просмотра, выберите диапазон, щелкните правой кнопкой мыши по графику и выберите "Масштаб".

  7. Перейдите по стеку фиксации, чтобы понять, какие функции выделили память. Символы должны быть загружены для стеков коммитов. Чтобы загрузитьсимволы, выберите символы>" в верхней строке меню навигации.

    Снимок экрана трассировки памяти анализатора производительности Windows

Применение анализа трассировки для уменьшения использования памяти

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

Некоторые области, которые следует рассмотреть в отношении применения анализа трассировки к обновлению кода для уменьшения использования памяти, включают:

  • Уменьшите использование памяти при использовании на переднем плане: анализ трассировки памяти может помочь определить любое ненужное использование памяти на переднем плане и обновить код, чтобы уменьшить или удалить это использование.

  • Минимизация работы в фоновом режиме: система имеет политику по постепенному удалению страниц из рабочих наборов процесса. Использование меньшего объема памяти в фоновом режиме позволяет системе быть более эффективным, сохраняя меньше памяти приложения. Узнайте больше о том, как улучшить потребление энергии и время работы батареи, свести к минимуму фоновую работу, которая также будет преобразовываться в использование меньшего объема памяти в фоновом режиме.

  • Выпуск ресурсов в фоновом режиме: во время выполнения приложение может создавать некоторые кэши памяти, а также создавать выделения графики для поддержки пользовательского интерфейса. Эти области памяти могут быть освобождены, когда приложение свернуто или не отображается. Приложение может регистрировать уведомления о низком уровне памяти, чтобы предпринимать соответствующие действия, но более разумной стратегией может быть освобождение памяти после периода бездействия, когда приложение признает себя неактивным. Этот период неиспользования может отличаться по приложению, поэтому возможные индикаторы неактивного использования могут варьироваться от горстки минут до 1/2 часа или более. Будьте внимательны, чтобы сбалансировать эту экономию памяти с скоростью реагирования. Если восстановление кэша является дорогостоящим, приложение может сохранить его на протяжении всего времени своего существования.

  • Убедитесь, что в приложении не происходит утечек памяти: Чтобы проверить наличие утечек, сначала установите базовый показатель устойчивого состояния, при котором использование памяти приложением стабилизируется и не растет выше определенного значения. Вы можете установить это устойчивое состояние, постоянно используя приложение или оставив его бездействующим в фоновом режиме. Используя трассировку для выявления возможной утечки памяти, вы можете определить, где в коде выделяется память и как её можно освободить после того, как она выполнила свои функции. Если память продолжает расти по мере запуска приложения, это, вероятно, указывает на утечку памяти. Увеличьте область, соответствующую росту в вашей трассировке, и тщательно проанализируйте стеки коммитов.

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

Объем дискового пространства относится к размеру приложения, если он хранится в неактивном состоянии (не выполняя код). Если приложение занимает много места на диске, это может быть возможность оптимизировать.

Существует несколько способов снижения объема дискового пространства приложения:

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

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

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

  • Необходимость доступа к большому объему дискового пространства во время выполнения также приведет к использованию памяти. Это повлияет на скорость реагирования приложения и системы в целом. Кроме того, если во время выполнения требуется небольшая доля места на диске, приложение может использовать место на диске неэффективно.

Ниже приведены несколько способов сокращения или повышения эффективности дискового пространства:

  • Примените принципы оплаты за воспроизведение к вашему диску (скачайте только то, что вам нужно): приложение может включать широкий спектр функций с не всеми функциями, применяемыми ко всем пользователям. Это может быть одной из причин большого объема на диске. Применяя принципы оплаты за игру, вы можете попросить пользователей выбрать только необходимые функции, переводя их на меньший объем дискового пространства при скачивании приложения. Дополнительное содержимое делается необязательным для скачивания только в том случае, если у пользователя есть потребность в более широких возможностях. Помимо функций, вы можете применять те же принципы "оплаты за игру" к поддержке языка. Приложение может включать подмножество популярных языковых настроек по умолчанию, с возможностью добавления дополнительных языков, которые опционально включаются или зависят от региональных настроек, заданных в системе пользователя.

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

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

  • Изучение возможностей двоичной оптимизации: средства, такие как SizeBench, позволяют авторам приложений исследовать, что способствует двоичному следу и найти возможности для уменьшения объема используемого дискового пространства.

Дополнительные ресурсы