Как стать автором
Обновить

Код, который не ест батарейку: программируем с умом и экономим ресурсы

Уровень сложностиСредний
Время на прочтение3 мин
Количество просмотров1.3K

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

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

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


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. Даже если это мило — это ещё и дорого (в плане энергии).


Заключение

Энергосберегающий код — это не отдельная дисциплина, а стиль мышления. Это умение задавать себе вопрос: "а действительно ли всё это нужно запускать прямо сейчас и именно так?"

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

Теги:
Хабы:
0
Комментарии2

Публикации

Истории

Работа

iOS разработчик
11 вакансий
React разработчик
45 вакансий
Data Scientist
56 вакансий
Swift разработчик
15 вакансий

Ближайшие события

4 – 5 апреля
Геймтон «DatsCity»
Онлайн
8 апреля
Конференция TEAMLY WORK MANAGEMENT 2025
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань
20 – 22 июня
Летняя айти-тусовка Summer Merge
Ульяновская область