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

Когда говорят о производительности кода, чаще всего имеют в виду скорость выполнения. Энергопотребление — слон в серверной. Программисты редко задумываются о том, сколько ватт сжирает их код. А ведь один бесконечный цикл без сна на сотне микроконтроллеров — и привет, электросчёт за май.
Нет, не будет морали про "спасите планету". Просто будет честный технический разбор: как конкретные архитектурные решения, алгоритмы и мелочи вроде лишнего обращения к памяти влияют на энергопотребление. И как это всё можно и нужно учитывать.
1. Энергия и алгоритмы: незаметная связь
Возьмём классическую задачу сортировки. На первый взгляд, выбор между пузырьковой и быстрой сортировкой — вопрос времени выполнения. Но если копнуть глубже, можно заметить: чем больше операций, тем выше нагрузка на процессор, больше обращений к памяти, выше энергопотребление.
import time
import random
import psutil
arr = [random.randint(0, 1000) for _ in range(10000)]
start = time.time()
arr.sort()
end = time.time()
print("Time:", end - start)
print("CPU usage:", psutil.cpu_percent(interval=1))
На таких игрушечных примерах разница в ваттах неуловима. Но если запустить подобную задачу сотни раз в фоновом режиме на мобильном устройстве — батарея это почувствует.
2. Спящий режим — лучший друг разработчика
Один из самых тупоэнергозатратных паттернов — это цикл без сна. Вот так делать не надо:
while True:
check_for_updates()
Вот так уже лучше:
import time
while True:
check_for_updates()
time.sleep(10) # Даем системе отдохнуть
Даже добавив паузу в пару миллисекунд, можно существенно снизить нагрузку на CPU. Особенно это актуально для устройств с ограниченным энергопитанием: микроконтроллеров, сенсоров, IoT-железа.
3. Ленивая инициализация — не только про производительность
Если вы инициализируете тяжелые объекты заранее, даже когда они не нужны — вы, по сути, тратите энергию впустую. Особенно актуально в мобильной разработке:
// Плохо
val player = MediaPlayer.create(context, R.raw.sound)
// Лучше
lazy var player: MediaPlayer by lazy {
MediaPlayer.create(context, R.raw.sound)
}
Инициализация по запросу — это не только про "быстрее грузится", это ещё и "реже включается проц".
4. Кэш — палка о двух концах
Кэширование уменьшает количество вычислений — и это хорошо. Но если кэш держится в оперативке и не чистится — это увеличивает потребление памяти, а вместе с ней и энергозатраты на её обслуживание.
const cache = {};
function fetchData(key) {
if (cache[key]) {
return cache[key];
}
const data = heavyCompute(key);
cache[key] = data;
return data;
}
Хорошо бы добавить срок жизни кэша или использовать слабые ссылки, если язык позволяет.
5. Асинхронность и энергоэффективность
Асинхронный код — это не только про "ничего не тормозит". Это ещё и про "ничего не крутится зря". Когда поток блокируется, он держит ядро CPU активным. Когда задача отложена, CPU может перейти в более экономичный режим.
import asyncio
async def periodic_task():
while True:
await do_something()
await asyncio.sleep(10)
Асинхронность позволяет использовать события вместо постоянного опроса — и этим экономит энергию.
6. Компиляторы и флаги: незаметный бонус (C/GCC)
Некоторые компиляторы (например, GCC) поддерживают флаги оптимизации, которые могут немного уменьшить энергопотребление за счёт агрессивной оптимизации инструкций:
gcc -O3 -march=native -o app main.c
Оптимизация под конкретную архитектуру позволяет использовать более эффективные машинные инструкции — а значит, меньше тактов, меньше энергии.
7. UI и графика: экран тоже ест
Особенно на мобильных устройствах: чем ярче UI, тем больше энергии уходит на подсветку. Тёмные темы, особенно на OLED-экранах, действительно экономят заряд. И это не шутка.
Кроме того, постоянно анимирующийся интерфейс гоняет GPU. Даже если это мило — это ещё и дорого (в плане энергии).
Заключение
Энергосберегающий код — это не отдельная дисциплина, а стиль мышления. Это умение задавать себе вопрос: "а действительно ли всё это нужно запускать прямо сейчас и именно так?"
И пусть сегодня у нас розетки повсюду и пауэрбанки в карманах, завтра может быть иначе. А ещё энергосберегающий код быстрее, стабильнее и просто... красивее. Потому что умный. А умный код — это всегда хорошо.