Приложение A. Рекомендации для разработчиков

В любой серьезном пособии по программированию рассматриваются вопросы производительности функций и выделения памяти. При разработке программ следует обращать внимание на их влияние на энергопотребление систем. Несомненно, это не затрагивает каждую строку кода, но поможет уменьшить вероятность неэффективного потребления.
Что может оказывать негативный эффект на энергопотребление системы?
  • Использование потоков.
  • Излишнее или неэффективное пробуждение процессора. Если пробуждение необходимо, выполните необходимые действия быстро и в одно и то же время.
  • Излишнее использование [f]sync().
  • Излишние периодические опросы (лучше применять тактику реагирования на события).
  • Низкая эффективность пробуждений.
  • Неэффективный доступ к дискам. Рекомендуется использование буферов большего объема для уменьшения частоты запросов доступа к диску и выполнение записи больших блоков за раз.
  • Неэффективное использование таймеров. По возможности рекомендуется группировать таймеры для программ (или даже систем);
  • Излишние операции ввода и вывода, потребления энергии и использования ресурсов памяти (включая утечку памяти).
  • Выполнение вычислений, в которых нет необходимости.
Ниже об этом будет рассказано более подробно.

A.1. Использование потоков

Использование потоков не всегда ускоряет работу приложений.
Python

В Python используются возможности глобальной блокировки интерпретатора (GIL, Global Interpreter Lock) [1], поэтому выполнение большого числа потоков имеет смысл только для больших объемов операций ввода/вывода.

Perl

Потоки Perl изначально предназначались для выполнения программ без ветвления (например, в 32-битных системах Windows). При этом данные копируются в каждый отдельный поток, а совместный доступ к ним по умолчанию не обеспечивается, так как пользователи должны иметь возможность контролировать предоставление общего доступа. Для этого используется модуль threads::shared, который дополнительно создает переменные для данных, что и замедляет обработку. [2]

C

Потоки C используют память совместно, при этом каждому потоку соответствует отдельный стек, а необходимости в создании ядром новых дескрипторов файлов и выделении дополнительной памяти нет. При этом в параллельных вычислениях может использоваться большее число потоков и принимать участие большее число процессоров. Для оптимизации производительности потоков рекомендуется использовать язык низкого уровня программирования — С или C++. Если же вы предпочитаете работать со сценариями, рекомендуется создавать C-проекции. Специальные инструменты анализа помогут идентифицировать низкопроизводительные секции кода [3].