Снижение энергопотребления приложений

Аннотация

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

Введение

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

Активная работа

Определение периода активности приложения звучит так: это время, в течение которого программа выполняет полезную работу. «Полезная работа» - это работа, необходимая для выполнения действия, непосредственно запрошенного пользователем. Работа, выполняемая в фоновом режиме, не считается «полезной работой». Можно привести следующие примеры периодов активности приложений: вычисление результатов в электронной таблице или работа поисковой системы по подбору результатов, соответствующих поисковому запросу пользователя. В обоих случаях действия первоначально запрашиваются пользователем, но затем программа выполняет работу без вмешательства пользователя. Среди других примеров - потоковая передача видео или запуск проверки на вирусы.

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

Общие рекомендации

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

Многопотокочность и параллельность

В современных устройствах все чаще используются многоядерные процессоры. Использование всех доступных ядер способствует не только повышению производительности, но и экономии электроэнергии. Имеет ли смысл нагружать одно ядро в течение длительного периода на полную или почти полную мощность, если можно выполнить задачу быстрее (и экономичнее), используя все доступные ядра? Если добиться одновременного использования наибольшего числа потоков или ядер, то программа будет работать быстрее, расходуя меньше электроэнергии. На приведенном ниже графике показано потребление электричества тремя разными приложениями при тестировании на процессоре Intel® Core™ второго поколения в операционной системе Windows® 7. Наибольшее превосходство многопотокового режима над однопотоковым демонстрирует мультимедиа-приложение, но все три программы расходуют меньше электричества в многопотоковом режиме.


Экономия электроэнергии трех различных приложений в однопотоковом и в многопотоковом режиме. Данные получены для процессора Intel® Core™ 2-го поколения на платформе Windows 7

Транзакции между пространством пользователя и пространством ядра

Одной из основных причин высокого потребления электричества в активном состоянии приложения является высокая частота системных вызовов. В многопотоковом приложении может возникнуть конфликт между потоками, взаимодействующими с ядром системы. Во избежание этих проблем используйте вызов API Windows «EnterCriticalSection()» для синхронизации межпроцессовой передачи данных между потоками в пространстве пользователя, а не вызов API Windows «WaitForSingleObject()», выполняющийся в пространстве ядра. Экономия потребления электроэнергии 4-потоковым приложением при снижении числа блокировок из-за конфликтов может достигнуть 60 % (по результатам тестирования на процессоре Intel Core™ 2-го поколения на платформе Windows 7).


Сравнение между WaitForSingleObject() и EnterCriticalSection() в 4-потоковом приложении. Данные получены для процессора Intel® Core™ 2-го поколения на платформе Windows 7

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

Сведение к минимуму перерывов и исключение постоянных опросов

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

Оптимизация часто используемого кода

Это один из базовых принципов. При оптимизации наиболее часто используемого кода достигается наибольший выигрыш, поэтому начинать нужно именно с этого. Одним из способов оптимизации такого кода является использование самых современных векторных инструкций, таких как SSE4.x, AVX1 или AVX2. Эти инструкции помогают выполнять часто используемые действия быстрее и с меньшим расходом энегрии.

«Оптом - дешевле»

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


Пример оптимизации расхода электричества системой хранения данных

Снижение использования оперативной памяти

Оптимизация использования оперативной памяти также поможет снизить потребление электроэнергии приложением в активном состоянии. Вот несколько рекомендаций:

  • Избегайте ненужного преобразования формата графики (например, преобразование из формата YUV в RGB и обратно) для доступа графическим процессоров и центральным процессором
  • Кэшируйте часто используемые структуры данных
  • Ограничивайте количество перемещений данных между пространством ядра и пространством пользователя
Некоторого выигрыша можно достичь, используя более экономичные (с точки зрения расхода электричества) методы и понимая, какие методы позволяют добиться экономии. В приведенной ниже таблице показано несколько методов Microsoft DirectX* 9 Present и соответствующие показатели расхода электричества при воспроизведении видео. Эти показатели получены для процессора Intel Core™ 2-го поколения на платформе Windows 7. В этом примере каждый пиксель кадра видео высокой четкости занимает в памяти либо 2 байта, либо 4 байта (при использовании формата, соответственно, YUY2 или RGB). Следовательно, формат YUY2 использует меньше памяти и является более эффективным.


Расход электричества методами DX9 Present для процессора Intel Core™ 2-го поколения на платформе Windows 7

Дополнительные предложения

В дополнение к приведенным выше рекомендациям можно сократить время использования привилегированного режима и заменить циклы ожидания Sleep(0) функцией Pause(). Существуют конкретные рекомендации для программ, предназначенных для работы определенного типа. Например, в разделе ссылок приведены предложения, касающиеся и оборудования, и программ, для экономии электричества при проведении видеоконференций.

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

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

  • 3D-игры: Когда система оповещает о работе от аккумуляторов, можно ограничить максимальную скорость кадров более низким значением
  • Видеопроигрыватели: При низком уровне заряда аккумулятора можно меньше использовать или отключить фильтры улучшения четкости и цветов изображения при воспроизведении
  • Произвольные приложения:
    • Не нужно обновлять экран, когда приложение свернуто
    • Выберите параметры по умолчанию, оптимальные с точки зрения экономии электричества
    • При работе от аккумулятора следует откладывать второстепенные задачи
    • Предлагайте пользователям дополнительные способы сокращения расхода электричества в виде необязательных параметров
Использование приведенных рекомендаций и собственных аналогичных приемов сделает работу пользователей более удобной и приятной. А разве не для этого мы вообще занимаемся созданием программных приложений?

Заключение

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

Einzelheiten zur Compiler-Optimierung finden Sie in unserem Optimierungshinweis.
Tags: