🚀Повышение эффективности кода. История про оптимизацию.
Оптимизация – это процесс улучшения уже существующего кода, чтобы он работал быстрее и потреблял меньше ресурсов. Улучшение эффективности часто связано с компромиссами. Оптимизация может увеличить скорость работы кода, но сделать его менее читаемым.
🛠️ Оптимизация часто требует баланса между производительностью и ясностью кода. Разработчики должны понимать требования проекта и знать, какие аспекты системы замедляют её работу.
❗️Каждый случай оптимизации уникален. В одном проекте проблемой может быть неэффективное использование памяти, в другом - неправильное управление потоками или процессами. Всегда стоит помнить, что оптимизация - это кроличья нора, в которой можно блуждать бесконечно. Важно оценить, насколько ваша оптимизация нужна проекту и бизнесу в целом.
Давайте на простых примерах посмотрим, когда нужна оптимизация, а когда нет.
Договоримся, что базово, у нас есть разраб, который стоит нам 2к рублей в час. Добавим сюда тестирование нового кода и прочие расходы, связанные с код ревью, менеджерами и тд. Пусть они стоят столько же - 2к руб в час.
И так, примеры:
1. Есть проект, который делает некоторый ежедневный прогноз, 1 раз в день в 00:00. Прогнозами пользуются только аналитики и некоторые стейкхолдеры. Разработчик видит, что можно оптимизировать расчет фичей в python и тратит 4 часа времени на оптимизацию, ускоряя выполнение кода на 5%.
2. Возьмем тот же скрипт, но теперь добавим вводных. Компания использует BigQuery для хранения данных, для прогноза используются 10 различных таблиц, данных очень много и каждый запрос стоит 10$. Сейчас в коде каждая таблица загружается отдельно по некоторым бизнес-правилам, агрегации происходят в python на основе пересечений и получается итоговая таблица. Для этого нужно сделать 10 запросов к базе по 10$, т.е. данные для прогноза стоят 100$ каждый день. Разработчик видит, что запросы в базу не очень оптимальны и их можно оптимизировать, объединить и тд, чтобы в итоге делать 3 запроса к базе, а не 10. Он тратит на это те же 4 часа, но теперь данные для прогноза стоят не 100$, а 30$.
Теперь посчитаем и подумаем, в каком случае оптимизация нужна была, а в каком нет.
В первом случае ускорение циклов стоило нам 8к + 8к рублей, итого 16к. При этом мы не получили никакого профита для бизнеса, т.к. прогнозы делаются 1 раз ночью и используются людьми в рабочее время. Поэтому, даже ускорение кода в 10 раз не принесёт никакого профита для компании, а разработчик потратит своё и не только время.
Во втором случае мы на оптимизацию запросов к базе потратили те же 16к рублей, но при этом получили сокращение ежедневных затрат на 70$, т.е. порядка 2к$ в месяц приносит такая оптимизация, на которую мы потратили условно 200$. Тут профитность очевидная.
🧠 Личный опыт
Оба примера выше из моей практики. В одной системе, разработанной для обработки больших данных, основная задержка происходила из-за множественных запросов к базе данных. И при профилировании мы увидели оба момента из примеров, но сначала оптимизировали запросы, оптимизация заключалась в объединении этих запросов в один, что значительно сократило время и стоимость запросов к базе. Но мы всё еще видели, что код выполнятся недостаточно быстро и на сдачу проверили, что же с ним не так. После 10 минут просмотра критических мест в коде нам удалось добавить оптимизации, причём прирост был колоссальный. Знаете что мы сделали? Убрали блоки sleep в нескольких местах, которые оставили разработчики во время отладки кода👍😂
Правила:
1️⃣: не начинайте улучшение эффективности, пока ваш код не отвечает всем требованиям проекта. Известная фраза гласит: "Преждевременная оптимизация – корень всех проблем". Сначала следует завершить основную разработку, а затем упрощать и ускорять код.
2️⃣: оптимизируйте только конкретный код. Профилирование кода помогает определить, где узкие места. Если профилирование показывает, что большинство времени выполнения занимает запрос к базе данных, оптимизация может включать переформулировку запроса или индексацию данных.
Post #65
749
- 🔥 6