Оптимизация кода

Оптимизация кода

Какая бывает и зачем нужна.

Мы тут разбираемся в важных понятиях большой разработки:

Что такое легаси

Зачем нужен рефакторинг

Что такое технический долг

Чтобы закрыть тему, поговорим об оптимизации.

Что такое оптимизация

Оптимизация кода — это когда программист берёт код из уже готовой и работающей программы и пытается его улучшить для какой-то цели. 

Что пытаются улучшить:

  • скорость работы,
  • скорость загрузки,
  • скорость ответа сервера,
  • стабильность,
  • объём кода.

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

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

Оптимизация скорости работы

Самая частая оптимизация кода — повышение скорости работы. 

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

Примеры того, как можно добиться ускорения:

  • Написать функции, которые будут предугадывать действия пользователя и заранее просчитывать некоторые ситуации.
  • Научить программу на какое-то время забирать себе все ресурсы компьютера. Остальным программам плохо, зато эта работает быстро.
  • Заменить короткие, но сложные команды фреймворка на много длинных, но более простых для компилятора, которые в сумме выполняются быстрее.
  • Написать лукап-таблицы: например, если алгоритму нужно сто тысяч раз посчитать значение синуса sin(x) с заранее известным шагом, то можно сразу написать таблицу всех нужных значений. Тогда алгоритм будет не считать синус с нуля, а заглядывать в табличку и быстро там всё находить.
  • Вставить код на ассемблере, чтобы выполнить его в процессоре напрямую, без компилятора высокого уровня — так программа будет работать намного быстрее.

Оптимизация скорости загрузки

Это похоже на предыдущий пункт, но с одним отличием: чаще всего увеличивают видимую пользователю скорость загрузки программы, а не полноценную загрузку всего. 

Этим приёмом часто пользуется компания Apple: они делают свои программы так, чтобы пользователь видел интерфейс практически сразу после запуска, но реально работать с программой можно лишь через 1–2 секунды. Дело в том, что на первое место ставится скорость отрисовки и загрузки интерфейса, а остальные модули программы загружаются на фоне, и на это тоже нужно время. Зато выглядит всё так, как будто программа запустилась моментально.

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

Оптимизация скорости ответа

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

При этом такие программы могут загружаться по 20–30 секунд или даже несколько минут. Никто не ждёт от них моментальной загрузки, а вот моментальная реакция на запросы — нужна.

Оптимизация для стабильности и отказоустойчивости

Если мы пишем код для больницы, в котором в реальном времени обрабатываем жизненные показатели всех пациентов, то нам важно такое:

  • программа не должна зависать из-за неправильно введённых данных;
  • программа должна работать, даже если сервер не отвечает или сломались датчики;
  • программа не должна падать под нагрузкой.

Короче: программу должно быть очень сложно сломать. 

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

Оптимизация для уменьшения объёма кода

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

Или другая ситуация: у нас есть код программы для одной версии умных часов, а нам нужно эти же функции перенести на другие часы, где контроллер попроще и памяти поменьше. 

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

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

Что дальше

Теперь мы полностью готовы работать над своим старым кодом: поддерживать легаси, делать рефакторинг и оптимизировать разные функции. Сделаем всё по очереди, но уже в другой раз.

Текст:

Михаил Полянин

Редактор:

Максим Ильяхов

Художник:

Даня Берковский

Корректор:

Ирина Михеева

Вёрстка:

Кирилл Климентьев

Соцсети:

Олег Вешкурцев

Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Начать карьеру в ИТ
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
Еще по теме
10 главных конструкций языка Kotlin
10 главных конструкций языка Kotlin

Почти как Java, но есть отличия.

easy
Haskell — ленивый язык программирования
Haskell — ленивый язык программирования

Он сам решает, что и когда нужно посчитать.

easy
Вам мало языка C? Попробуйте C++
Вам мало языка C? Попробуйте C++

Шустрый, мощный, весь обвешан классами.

medium
Как защитить сайт от хакерских скриптов
Как защитить сайт от хакерских скриптов

Включите политику безопасности.

medium
Все знают о мужчинах в IT. А вот и женщины

Феминисткам всё равно не понравится эта статья, а вы прочитайте

easy
10 главных конструкций языка Swift
10 главных конструкций языка Swift

Быстрый гайд по языку.

easy
WebStorm: это что и зачем?
WebStorm: это что и зачем?

Разбираем один из любимых редакторов кода всея Руси.

easy
Как работает сканер отпечатка пальца
Как работает сканер отпечатка пальца

Удобно, но не всегда безопасно.

medium
10 главных конструкций языка Java
10 главных конструкций языка Java

Простой и мощный язык.

easy
Смартфон для программиста

Что выбрать, если хотите заняться мобильной разработкой.

easy
Что такое альфа- и бета-версии
Что такое альфа- и бета-версии

Иногда тестировщики — это мы с вами

easy
Разбор: непобедимый алгоритм для игры «4 в ряд»
Разбор: непобедимый алгоритм для игры «4 в ряд»

Разбор видео Code Bullet про трюки в оптимизации алгоритмов

medium
Как работает сортировка расчёской
Как работает сортировка расчёской

Улучшаем пузырьковую сортировку.

easy
easy