Повышение производительности приложения путем уменьшения использования памяти и дискового пространства
В этом руководстве показано, как повысить производительность приложения Windows двумя основными способами:
Минимизация использования памяти
Существует множество способов свести к минимуму объем памяти, используемой приложением Для Windows, можно:
- Сокращение использования памяти переднего плана
- Свести к минимуму фоновую работу
- Выпуск ресурсов в фоновом режиме
- Убедитесь, что приложение не утечет памяти
Чтобы свести к минимуму использование памяти, сначала важно понимать следующее:
- как используется и выделяется память, используя рабочий набор, динамическую память и виртуальное выделение,
- как записать системную трассировку и
- как проанализировать трассировку системы.
После анализа системной трассировки мы рекомендуем применить анализ трассировки для уменьшения использования памяти.
Рабочий набор, динамическая память и виртуальное выделение
Рабочий набор приложения — набор страниц в своем виртуальном адресном пространстве, который в настоящее время находится в памяти, является одной из мер использования памяти приложения.
Объем памяти, используемой приложением, влияет на производительность среды выполнения, а также скорость реагирования системы в целом. Минимизация использования памяти поможет приложению повысить производительность, сокращая затраты на ЦП, связанные с доступом к большему объему памяти. Более низкое использование памяти также помогает с скоростью реагирования системы, и взаимодействие пользователя приложения в целом, так как приложение не в конечном итоге переместит другое содержимое памяти.
Перемещение памяти может произойти, так как система пытается сохранить доступ к содержимому в памяти недавно и при необходимости обрезать и вывести содержимое страницы, используемое ранее. Когда пользователь переключается обратно в оболочку или другое приложение, а необходимые данные не являются резидентными в памяти, данные должны быть считываться с диска. Пользователь, скорее всего, заметит замедление из-за этого процесса.
Существует два ключевых фрагмента памяти, используемой приложением: 1) динамическая память и 2) файловая резервная память. Использование файловой памяти происходит из двоичных файлов и файлов данных, таких как базы данных, используемые приложением. Это обычно не является значительным фрагментом использования памяти приложения и часто константой. (Исключения — это приложения обработки данных, компиляция кода и т. д.) Более значительный источник использования памяти и место утечки манифеста — динамическая память.
Динамическая память соответствует виртуальной памяти, выделенной приложением с помощью подпрограмм выделения памяти. В отличие от памяти с поддержкой файлов, которая сохраняется во время перезагрузки системы, динамическая память существует только в течение времени существования приложения. Динамическая память — это распространенный источник использования памяти и манифест утечки памяти.
Подпрограммы виртуального выделения (VirtualAlloc
) обрабатывают запросы на выделение памяти из приложения Windows независимо от подпрограммы уровня приложений, используемой для выделения памяти. Хотя не все памяти, выделенные приложением, могут находиться в памяти все время, анализ таких выделений обеспечивает согласованный способ понимания использования памяти приложения.
Чтобы понять использование памяти приложения и найти места для улучшения, рекомендуется записывать трассировку VirtualAllocation, как описано ниже.
Запись системной трассировки для анализа использования памяти
Запись действия устройства за период времени называется трассировкой системы. Трассировка системы создает файл трассировки, который можно использовать для создания отчета и помогает определить, как повысить производительность приложения.
Трассировки могут отличаться по длине:
- Для записи запуска приложения можно использовать короткую трассировку. Это может включать переход приложения в неактивное состояние, в котором окно приложения свернуто или окна приложения закрыты во время сохранения процесса приложения.
- Длинная трассировка, как правило, несколько минут в течение нескольких минут, полезна при диагностике утечки памяти. Если использование памяти продолжается с течением времени, это обычно предполагает утечку.
Существует несколько средств для мониторинга использования памяти, в том числе:
В целях этой статьи мы сосредоточимся на использовании Windows Анализатор производительности. Дополнительные сведения о выборе средства профилирования производительности приложения см. в статье "Выбор среди профилировщика производительности Visual Studio", Набора средств производительности Windows и PerfView.
Чтобы записать трассировку:
Откройте командную строку (PowerShell или командную строку) в режиме администратора. (Если не выполняться в режиме администрирования, может появиться код ошибки: 0xc5585011 "Не удалось включить политику для профилирования производительности системы".
Введите команду:
wpr -start VirtualAllocation -filemode
.Запустите сценарий, который вы изучаете. (Например, запуск приложения.)
Введите команду:
wpr -stop Trace.etl
.
Анализ трассировки системы
Чтобы найти, какая из функций приложения имеет выделенную память, которую можно уменьшить, теперь необходимо проанализировать системную трассировку, которая была записана. Чтобы проанализировать трассировку, выполните следующие действия.
Откройте трассировку с помощью Windows Анализатор производительности, введя команду:
wpa.exe Trace.etl
В окне обозревателя графов разверните раздел "Память", щелкните правой кнопкой мыши граф "Общая фиксация" и выберите "Добавить граф в новое представление анализа".
Откройте редактор представления, щелкнув шестеренку "Параметры" и выбрав следующее расположение столбца: Process, Commit Type, Commit Stack and Size.
Щелкните заголовок столбца Size, чтобы результаты были отсортированы в порядке убывания. Стек фиксации показывает путь кода, ведущий к выделению памяти. Эти результаты могут помочь понять причину выделения. Сортировка по размеру позволяет сосредоточиться на более крупных выделениях и выяснить, есть ли возможность оптимизировать.
Отфильтруйте нужные процессы, щелкнув процесс правой кнопкой мыши и выбрав фильтр для выбора.
Чтобы увеличить масштаб в интересующем регионе в области просмотра, выберите диапазон, щелкните правой кнопкой мыши график и выберите "Масштаб".
Перейдите по стеку фиксации, чтобы понять, какие функции выделены памятью. Стеки фиксации потребуются символы, загруженные. Чтобы загрузить символы, выберите символы "Загрузка трассировки>" в верхней строке меню навигации.
Применение анализа трассировки для уменьшения использования памяти
При анализе выделенной памяти вы найдете подсказки, которые помогут вам решить, где можно свести к минимуму использование памяти.
Некоторые области, которые следует рассмотреть в отношении применения анализа трассировки к обновлению кода для уменьшения использования памяти, включают:
Уменьшите использование памяти при использовании на переднем плане: анализ трассировки памяти может помочь определить любое ненужное использование памяти на переднем плане и обновить код, чтобы уменьшить или удалить это использование.
Минимизация работы в фоновом режиме: система имеет политики, чтобы вывести страницы из рабочих наборов процесса. Использование меньшего объема памяти в фоновом режиме позволяет системе быть более эффективным, сохраняя меньше памяти приложения. Узнайте больше о том, как улучшить потребление энергии и время работы батареи, свести к минимуму фоновую работу, которая также будет преобразовываться в использование меньшего объема памяти в фоновом режиме.
Выпуск ресурсов в фоновом режиме: во время выполнения приложение может создавать некоторые кэши памяти, а также создавать выделения графики для поддержки пользовательского интерфейса. Эти выделения могут быть освобождены, если приложение свернуто или не отображается. Приложение может регистрировать уведомления с низкой памятью для принятия таких действий, но лучшей стратегией может быть освобождение памяти после периода использования, когда приложение завершает его неактивным. Этот период неиспользования может отличаться по приложению, поэтому возможные индикаторы неактивного использования могут варьироваться от горстки минут до 1/2 часа или более. Будьте внимательны, чтобы сбалансировать эту экономию памяти с скоростью реагирования. Если кэш является дорогостоящим для перестроения, приложение может сохранить его в течение всего времени существования приложения.
Убедитесь, что приложение не утечет памяти. Чтобы проверить утечку памяти, сначала установите тест устойчивого состояния, где объем использования памяти приложения превышает определенное значение. Вы можете установить это устойчивое состояние, постоянно используя приложение или оставив его бездействующим в фоновом режиме. Используя отслеживаемую трассировку для выявления возможной утечки памяти, вы можете найти, где выделена память в коде и как ее можно освободить после того, как она выполнила свою цель. Если память продолжает расти по мере запуска приложения, это, вероятно, указывает на утечку памяти. Увеличьте область, соответствующую росту трассировки, и тщательно проанализируйте стеки фиксации.
Эффективное использование места на диске
Объем дискового пространства относится к размеру приложения, если он хранится в неактивном состоянии (не выполняя код). Если приложение занимает много места на диске, это может быть возможность оптимизировать.
Существует несколько способов снижения объема дискового пространства приложения:
По мере того как диск будет заполнен, файловая система больше не может хранить новое содержимое в непрерывном режиме. Полный диск становится фрагментирован, сохраняя новое содержимое в несвязанных секторах. Это преобразуется в более длительное время задержки при доступе к содержимому с диска. Системы ввода-вывода обеспечивают гораздо лучшую пропускную способность диска, если содержимое является непрерывным и может быть доступно последовательно или с помощью больших IOs.
Полный диск может перевести на более длительные задержки записи для систем на основе SSD. Если для поглощания операций записи меньше пустых ячеек, запись может привести к операции чтения и изменения записи, что замедляет производительность.
Полный диск может препятствовать обновлению приложения. Хотя ОПЕРАЦИОННая система устойчива и может поддерживать систему в актуальном состоянии и безопасной, даже с низким объемом свободного места на диске, работоспособное количество свободного места на диске для промежуточного хранения содержимого для обновления приложения приведет к более быстрому и плавному обновлению.
Необходимость доступа к большому объему дискового пространства во время выполнения также приведет к использованию памяти. Это повлияет на скорость реагирования приложения и системы в целом. Кроме того, если во время выполнения требуется небольшая доля места на диске, приложение может использовать место на диске неэффективно.
Ниже приведены несколько способов сокращения или повышения эффективности дискового пространства:
Примените принципы оплаты за воспроизведение к вашему диску (скачайте только то, что вам нужно): приложение может включать широкий спектр функций с не всеми функциями, применяемыми ко всем пользователям. Это может быть одной из причин большого объема на диске. Применяя принципы оплаты за игру, вы можете попросить пользователей выбрать только необходимые функции, переводя их на меньший объем дискового пространства при скачивании приложения. Дополнительное содержимое делается необязательным для скачивания только в том случае, если у пользователя есть потребность в более широких возможностях. Помимо функций, вы можете применять те же принципы "оплаты за игру" к поддержке языка. Приложение может включать подмножество популярных вариантов языка по умолчанию с дополнительными языками, которые необязательно включены или зависят от расположения, заданного в системе пользователя.
Применение эффективного размера кэша. В некоторых случаях приложение может использовать кэши на диске, чтобы повысить скорость реагирования пользователя. Политики можно задать для управления кэшем в приложении с максимальным ограничением размера кэша на основе емкости диска и изменения размера кэша, если доступное место на диске недостаточно.
Применение эффективного использования ресурсов: приложение часто включает ресурсы изображений и может состоять из диапазона размеров изображения для поддержки нескольких разрешений. Оптимизация размера изображения, измерений, форматирования и сжатия для подмножества разрешений и использование масштабирования для поддержки оставшихся разрешений может значительно сократить объем дискового пространства.
Изучение возможностей двоичной оптимизации: средства, такие как SizeBench, позволяют авторам приложений исследовать, что способствует двоичному следу и найти возможности для уменьшения объема используемого дискового пространства.
Дополнительные ресурсы
Windows developer