Про микрооптимизацию

Особо люблю разработчиков и разраборуководителей, у которых разработка доходит до точки “а сейчас надо тонко тюнить”, после чего ребятки вспоминают летучие фразы про оптимизации и сваливают в закат. Ваще не барское дело код шлифовать, проще машин подсыпать. Особенно если не платишь за них из своего кармана.
Тут такое дело.
Во-первых, действительно, не надо тонко тюнить код, если всё остальное в огне. Сначала надо сделать толково уровнями выше.
Во-вторых, действительно, не надо тонко тюнить код, если есть очевидные косяки вроде вытаскивания одним запросом всей базы ради одной записи.
В-третьих, следует помнить, что большинство умных и красивых фраз про оптимизацию говорилось в иных реалиях иных времён. А именно тогда, когда код, что обрабатывал миллион объектов в N секунд, писался не теми, для кого говорили красивые фразы. Вот как ребёнку запрещают в розетку вообще что-либо засовывать, а взрослый даже отвёрткой тыкает, так и в разработке все эти красивости от седовласых мужей не для всего контингента. Лишь бы джуниор проникся. А такой же седовласый сеньор, например, так и будет использовать goto там, где считает нужным.
Наше время — время тех, для кого “миллион” является обыденностью. Миллион запросов. Миллион строк. Миллион объектов. Потому микрооптимизация едва ли не обязательна.
Дальше арифметика. Знаю, не все её любят. Бывает даже стыдно смотреть в глаза взрослым людям, которые в разработке видят интуитивное искусство, а не инженерство с линейкой, но… простите.

Предположим, сервис 1K раз ходит в базу для того, чтобы каждый раз вытащить 1K строк, с которыми что-то надо сделать в функции nextSomething(). Да хоть из сырой строки сделать объект. Получаем 1M вызовов функции. Очень штатное по нынешним временам.
Предположим, функция написана неплохо, но всё же есть потеря 1ms потому, что… да до фига причин. Лишний лог пишет. Или вместо StringBuilder использует String в развесистой конкатенации переменных. Или массив создаёт на N элементов, а в процессе раздувает до N в квадрате. Короче, 1ms теряется. Ну и ладно, да? Одна туда, одна сюда, не жалко.
Это 1M ms. Это 16 минут. Пусть 15 даже для округлости. Дважды в сутки эта тысяча по тысяче выполнится и ой, 30 минут пустого прогрева окружающей среды. 15 часов в месяц.
Сколько таких функций в сервисе? На скольких инстансах раскатан этот сервис? Достаточно 10 функций и 5 инстансов, чтобы при таком раскладе в трубу ежемесячно вылетал месяц.
Всё ещё игнорируем тюнинг в 1ms, а? А если за этот месяц платить будет не работодатель, но вы? Будет интереснее?

Даже если не брать во внимание финансовый фактор (ах, как это удобно), остаётся некоторая профессиональная тонкость. Правильные разработчики пишут эффективный код. Среди прочего это ТАКЖЕ (капсом для тех, у кого человек может быть либо здоровым, либо богатым, но не здоровым И богатым одновременно) работающий максимально быстро код, использующий возможности окружения на всю катушку.
Для написания такого кода надо очень хорошо знать язык, интерпретаторы / компиляторы, операционные системы и прочее, прочее, прочее. Так вот, наблюдение: абсолютно (подчеркну: абсолютно) все разработчики, от которых я слышал критику в сторону микротюнинга, очень плохо знали матчасть ниже синтаксиса языка. Зачастую и в синтаксисе плавали. А вот бойцы, старательно выгрызающие эти злосчастные миллисекунды, наоборот, что в теории, что в практике подкованы были очень, очень хорошо.
Случайное совпадение? Безусловно.

Закругляюсь.
Код, впустую гоняющий сервера, подобен древней китайской ТЭС на угле.
Возьмите исходник. Возьмите профайлер. Найдите узкое место. Посимвольно разберите его, для каждого символа отыскав толкование в спецификациях. Попробуйте улучшить. И ещё. И ещё.
Может быть, вам понравится результат и вы захотите улучшить остальные места, чем и займётесь на выходных. Глядишь, в итоге половину инстансов можно будет погасить, что благотворно скажется на экологии планеты.
Ведь хорошо же, когда вместо одной пустой миллисекунды (и сотен ДЦ для таких “потребителей”) появляются зелёные деревья с разноцветными птичками. Очень хорошо.

Добавить комментарий