Создание энергоэффективных приложений Windows * Store для мобильных устройств — влияние CPU на энергопотребление платформы

Writing Energy-Efficient Windows* Store Applications for Mobile Devices [Eng., PDF 753KB]

 

1. Введение

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

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

Различные приложения могут влиять на энергопотребление различными компонентами оборудования: CPU, GPU, устройством хранения данных, сетевым адаптером, датчиками и пр. В серии статей, посвященных экономии электроэнергии, мы обсудим правила проектирования энергоэффективных приложений для различных аппаратных компонентов. Это руководство основано на серии лучших методик для примеров приложений для магазина Windows с реализацией функций и классов в новом наборе API — среде выполнения Windows (WinRT).

В этой статье мы рассматриваем влияние потребления питания центральным процессором. Сначала мы поговорим о состояниях энергопотребления процессора, а затем обсуждим влияние определенных API WinRT на работу CPU.

2. Состояния энергопотребления процессора

Современные процессоры поддерживают несколько состояний энергопотребления. Все эти состояния можно разделить на две категории: активные состояния и состояния сна. Активное состояние включает несколько рабочих состояний (P-состояний), которые различаются напряжением питания и частотой процессора. Состояние сна включает несколько C-состояний (Cx-состояний), которые различаются уровнем экономии энергии. Подробные определения активных состояний и состояний сна см. в технических спецификациях процессоров на базе архитектуры IA.

2.1 Активное состояние

Активное состояние (состояние C0) означает, что процессор выполняет инструкции. Активное состояние включает несколько P-состояний, различающихся напряжением питания и частотой процессора. Каждому P-состоянию соответствует определенное напряжение питания и определенная частота CPU. В более высоком P-состоянии выше и напряжение питания, и частота. Динамические потребление электроэнергии в определенном P-состоянии можно вычислить с помощью следующего уравнения:

P = CdynV2F

где P — динамическое потребление электроэнергии в определенном P-состоянии. Cdyn — динамическая нагрузка на CPU. V и F, соответственно, напряжение питания и частота CPU в данном P-состоянии. Из этого уравнения следует, что в более высоком P-состоянии CPU потребляет больше электроэнергии.

2.2 Состояние сна

Бездействующий процессор переходит в состояние сна для экономии электроэнергии. Многие процессоры на основе архитектуры IA поддерживают несколько состояний сна (так называемых Cx-состояний), например C1, C2/C3, C5, C6 и C7. В состоянии C1 процессор обычно остановлен, поскольку не нужно выполнять никакие инструкции. Состояние C2/C3, если поддерживается, обеспечивает пониженное потребление электроэнергии по сравнению с состоянием C1. В состоянии C2/C3 кэш процессора остается включенным, а основные функции отключены. Состояния C5/C6/C7 (если поддерживаются) — дополнительные состояния глубокого сна. По мере перехода из состояния C1 в состояние C7 потребляемая процессором мощность снижается, но увеличивается задержка при пробуждении процессора.

2.3 Управление состояниями энергопотребления

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

2.4 Проведение эксперимента

Мы провели тесты с использованием типового таймера в приложении для магазина Windows. Тесты были проведены на ультрабуке с процессором Intel® Core™ 3-го поколения и с чистой установкой коммерческой версии Windows 8. Для измерения потребляемой мощности мы использовали Intel® Power Gadget. Скорость обновления экрана платформы — 60 кадров в секунду (кадр/с).

3. Влияние таймеров

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

3.1 Создание и отмена таймера пула потоков

Среда выполнения Windows включает класс ThreadPoolTimer. Программные таймеры в приложениях можно создавать путем вызова функций CreateTimer или CreatePeriodicTimer в этом классе. Таймеры широко используются для создания потоков в приложениях для магазина Windows. Мы реализовали периодический таймер путем вызова функции CreatePeriodicTimer.

В примере кода показано использование API для создания периодического таймера.

private void CreatePeriodicTimer(object sender, RoutedEventArgs args)
{
     if (int.TryParse(PeriodMs.SelectionBoxItem.ToString(), 
         out ThreadPoolSample.PeriodicTimerMilliseconds))
     {
      ThreadPoolSample.PeriodicTimer = ThreadPoolTimer.CreatePeriodicTimer(
          (timer) => {
          System.Threading.Interlocked.Increment(ref   
              ThreadPoolSample.PeriodicTimerCount);
              Dispatcher.RunAsync(
                  CoreDispatcherPriority.High, () =>
                  {                                  
                       ThreadPoolSample.PeriodicTimerScenario.UpdateUI(
                       Status.Completed);
                  });
      },
      TimeSpan.FromMilliseconds(
          ThreadPoolSample.PeriodicTimerMilliseconds));
      UpdateUI(Status.Started); //Do nothing or update XAML textbox
}

Образец кода 1. Создание периодического таймера с помощью класса ThreadPoolTimer **

В примере кода показано использование API для отмены периодического таймера.

private void CancelPeriodicTimer(object sender, RoutedEventArgs args)
{
     if (ThreadPoolSample.PeriodicTimer != null)
     {
         ThreadPoolSample.PeriodicTimer.Cancel();
         ThreadPoolSample.PeriodicTimerCount = 0;
         UpdateUI(Status.Canceled);
     }
}

Образец кода 2. Отмена периодического таймера с помощью класса ThreadPoolTimer **

3.2 Влияние интервала периодического таймера

Мы сравниваем периодические таймеры с различными интервалами, срабатывающие без нагрузки и с простым обновлением текстового поля в пользовательском интерфейсе XAML. На рис. 1 показано среднее энергопотребления процессором по отношению к расходу электроэнергии при простое процессора в различных тестах.


Рисунок 1. Влияние интервала периодического таймера на потребляемую мощность CPU

Когда периодические таймеры срабатывают без нагрузки, потребление питания процессором близко к состоянию простоя даже при разной частоте таймеров. Это означает, что драйвер процессора и операционная система оптимизируют планирование работы таймера и поддерживают пониженный расход электроэнергии для процессора при незначительной нагрузке. Когда таймеры срабатывают с простым обновлением пользовательского интерфейса, по мере сокращения интервала таймера потребляемая мощность процессора увеличивается по экспоненте и в 1,72 раза превышает потребляемую мощность в режиме простоя. График роста потребления электроэнергии позволяет узнать, какие механизмы запускаются периодическим таймером в приложении. Рекомендуем разработчикам тщательно подходить к выбору интервала таймера, чтобы удовлетворить требованиям приложения без излишней нагрузки на CPU. Ненужный таймер необходимо отключать.

3.3 Резидентность P- и C-состояний

Резидентность P- и C-состояний указывает процент времени, в течение которого процессор остается в определенном Р- или С-состоянии. Как правило, сумма всех резидентностей С-состояний (С0–С7) равна 100 %, как и сумма всех резидентностей Р-состояний. Для примера с периодическим таймером, срабатывающим для простого обновления XAML, данные о резидентности Р- и С-состояний приведены в таблице 1.

Таблица 1. Резидентность P- и C-состояний для периодического таймера, срабатывающего для обновления пользовательского интерфейса

В таблице 1 видно, что при небольшом значении интервала таймера (5 или 16 мс) резидентность состояния C7 равна нулю: из-за слишком частого срабатывания таймеров процессор вообще не переходит в состояние глубокого сна. Для обновления пользовательского интерфейса процессор должен пробудиться из состояния С6. Если увеличить интервал таймера (20 или 100 мс), процессор проводит около 70 % времени в состоянии C7. Таким образом, потребляемая мощность процессора снижается в состоянии сна.

Значение резидентности P-состояния указывает, что при кратких интервалах таймера процессор работает 100 % активного времени с номинальной частотой. Обратите внимание, что режим работы с номинальной частотой отнюдь не является наиболее низким Р-состоянием. Если же увеличить интервал таймера, процессор может перейти в более низкое Р-состояние. Таким образом, потребляемая мощность процессора снижается в активном состоянии.

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

4. Сравнение ThreadPoolTimer и DispatcherTimer

Среда выполнения Windows предоставляет еще один таймер в классе Windows.UI.Xaml.DispatcherTimer. Сравним работу этих двух классов при простом обновлении пользовательского интерфейса XAML. Класс DispatcherTimer предоставляет таймер, интегрированный в очередь диспетчера, которая обрабатывается с заданным интервалом времени и с заданным приоритетом.

4.1 Создание и отмена таймера диспетчера

DispatcherTimer создается, как показано в приведенном ниже образце кода.

private void CreateDispatcherTimer(object sender, RoutedEventArgs args)
{        
    if (int.TryParse(PeriodMs.SelectionBoxItem.ToString(), 
         out ThreadPoolSample.PeriodicTimerMilliseconds))
         {
             dispatcherTimer = new DispatcherTimer();
             dispatcherTimer.Tick += UpdateUIwithDispatcherTimer;
             dispatcherTimer.Interval = TimeSpan.FromMilliseconds(
                 ThreadPoolSample.PeriodicTimerMilliseconds);
             dispatcherTimer.Start();
         }
}

Образец кода 3. Создание периодического таймера с помощью класса DispatcherTimer **

private void CancelDispatcherTimer(object sender, RoutedEventArgs args)
{
    dispatcherTimer.Stop();
}

Образец кода 4. Отмена таймера с помощью класса DispatcherTimer **

4.2 Кадровая скорость потока пользовательского интерфейса и сравнение энергопотребления

Мы реализуем два таймера в приложении для магазина Windows, чтобы обновлять простое текстовое поле XAML с различными периодическими интервалами. Сравнение кадровой скорости потока пользовательского интерфейса и потребляемой мощности процессора показано на рис. 2. Ломаные линии представляют среднюю потребляемую мощность процессора по сравнению с потреблением в режиме простоя. Столбцы представляют кадровую скорость потока пользовательского интерфейса, с этой скоростью обновляется текстовое поле XAML.


Рисунок 2. Сравнение кадровой скорости потока пользовательского интерфейса и потребляемой мощности CPU для двух реализаций в приложении для магазина Windows*

Из графика видно, что при определенном интервале таймера процессор потребляет меньше электроэнергии при использовании таймера DispatcherTimer. Это обусловлено тем, что класс DispatcherTimer ограничивает кадровую скорость потока пользовательского интерфейса (30 кадр/с) половиной скорости обновления экрана (60 кадр/с). Поэтому мы рекомендуем разработчикам приложений использовать класс DispatcherTimer для обновления пользовательского интерфейса.

5. Итоги

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

6. Дальнейшее обсуждение

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

7. Об авторе

Сушу Чжанг (Sushu Zhang) работает программистом в подразделении Intel по разработке ПО и обслуживанию. Она занимается вопросами интеграции платформ на базе Intel с ОС Android и Windows в ISV. Ею разработан инструмент Intel® Power Monitoring Tool для устройств Android. В последнее время Сушу принимала участие в нескольких проектах Intel по оптимизации энергопотребления. До перехода в Intel она работала в корпорации Майкрософт и занималась энергоэффективностью Windows. Сушу получила степень доктора наук по компьютерным наукам в Университете штата Аризона. Областью ее научных интересов были энергопотребление систем и управление рабочими температурами.

Copyright© 2012 Intel Corporation. All rights reserved.

Nähere Informationen zur Compiler-Optimierung finden Sie in unserem Optimierungshinweis.