Оптимизация скорости работы приложений

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

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

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

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

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

Хочу заметить, что при любом размере проекта основным приоритетом являются фичи, а нагрузка является нефункциональным требованием с меньшим приоритетом. Поэтому обычно на нее обращают внимание когда программа начинает заметно тормозить. Спасибо за внимание!

Лига программистов

1.6K постов11.5K подписчиков

Правила сообщества

- Будьте взаимовежливы, аргументируйте критику

- Приветствуются любые посты по тематике программирования

- Если ваш пост содержит ссылки на внешние ресурсы - он должен быть самодостаточным. Вариации на тему "далее читайте в моей телеге" будут удаляться из сообщества