Семен ([info]sim0nsays) wrote,
@ 2006-09-12 00:59:00
Previous Entry  Add to memories!  Tell a Friend  Next Entry
Entry tags:tech

Jedi optimization guide
Все мы понемногу что-то там да оптимизяли, то производительность, то расход памяти, то трафик, то еще что-то. Оптимизация прекрасна тем, что всегда свежа и неожиданна - так как пишешь код всегда с примерным учетом того, что уже знаешь, и в необходимых местах автоматически кодаешь вменяемо, то задача каждый раз формулируется по-новому.

Разные джедаи подходят к этой вечно новой задаче по-разному.


В классических книжках пишут общие принципы - сначала запрофайлить приложение и посмотреть, кто хавает больше всего, постулируя принцип 90-10, потом найти эти боттлнеки, разложить их по полочкам и понять, во что и как они упираются. Сначала попытаться пересмотреть алгоритм и побороться за О-большое от чего-нибудь, потом прикинуть, как можно совсем по-другому, и только потом опускаться на low-level. После изменения в коде обязательно-обязательно сравнить его с изначальным вариантом во всех интересующих ситуациях, убедиться что все ведет себя именно так, как задумано, и только потом продолжать. Под конец написать регресионные тесты и держать старую реализацию под боком как эталонную. Все это сопровождается замечательными советами в духе "Design for Performance", "Never trust anyone except profiler" и прочими коммунистическим лозунгами.
Отличная сборка такого классического изложения - например тут.

Все эта теоретика кайфа - путь сферического светлого джедая в вакууме страны эльфов. Да, хорошо бы, если так. На практике же боттлнеков получается штук 10 различных, разложить каждую по полочкам занимает полдня, а упираются они в три-четыре разных фактора. Причем, еще и только на данной конкретной конфигурации железа.
Алгоритмы кроме явных недосмотров (а чем круче светлый джедай, тем меньше он их допускает) толком не пошевелить, архитектура выбрана локально-оптимальная (мы же пишем внятный и правильный код, чтобы работало!), и если и может быть переделана, то только большими усилиями - условно глобальной перетряской.
Изменения, потенциально дающие хороший буст, действительно дают его в первой итерации, но с каждым баг-фиксом есть шанс, что он уменьшится. Ведь багфикс - это вполне возможно ветвление в неожиданном месте, дополнительные данные протащить и нарушение тонкого кислотно-щелочного баланса оптимизированного кода, а то и архитектурный хак чтобы поддержать совместимость с прошлой моделью. Путь светлого джедая - путь потерь.
Ну и конечно, в реальной жизни никогда нет времени для полного и исчерпывающего профайлинга. На какие ухищрения приходится идти, чтобы в любимой графике что-то померять я писал в одном из прошлых постов, и у меня нет серьезной уверенности, что в других областях все намного лучше. В реальной жизни профайлер вносит существенные изменения в работу. В реальной жизни "Design for Performance" очень быстро упирается в то, что дизайн уже вот он, и переделывать его тупо нет ни времени, ни денег.

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

Знаете, как живут в такой ситуации темные джедаи?

Темные джедаи пишут код совсем не так. Во-первых, код должен не быть красивым, а компиляться. Не быть правильным, а запускаться. Не быть надежным, а работать. Во-вторых, первый вариант должен быть готов максимально быстро (желательно - утром), соответственно, чем большим можно пренебречь, тем лучше. Разумеется, этот код начинают использовать и привыкать к его возможностям. Вот все слышали, что арт решает? Он и правда решает, будь там шейдер что из 20 инструкций, что из 100, также зажжот и на прототипе.
Далее, приходит волшебный момент, когда джедая таки садят код оптимизять - что-то тормозит. Темный джедай посылает всех понятно куда - нахрен. Еще через некоторое время садят таки насильно - все уже не просто тормозит, а не дышит уже совсем никак, спеки проебаны напрочь. Он засучивает рукава, и через полдня становится радостный - оба-на, нашел пару мест в которых просиралось 80% производительности! Все помнят мего-анекдот?

"Сдавайтесь, у вас закончились ракеты, а у нас еще 3 штуки осталось"
"Вчера в Сибири была однаружена заброшенная ракетная база, так что теперь у нас 20 ракет, а у вас только 3".
"Эх, предупреждал меня предшественник, что если что и погубит Америку, дак это русская безалаберность."


Вот, это именно оно. И чем круче темный джедай - тем у него таких ракетных баз в Сибири больше. Разумеется, не надо разбираться, во что уперт конкретный боттлнек, надо просто оптимизировать заведомо неправильно написанные куски, благо этого более чем достаточно. Надеюсь, не нужно объснять, почему кристально-чистое понимание только мешает? Путь темного джедая - путь приобретений.
В свете основного жизненного закона вполне можно писать плохой код! Да, мы выйдем с более слабыми показателями, но ведь выйдем же! Выйдем в отличие от неудачников, которые запустили энтропию дальше.
В реальной жизни, конечно, все гораздо веселее, атмосфера паники и бардака не в пример выше. Оно и понятно - "О май год, а вдруг базу в Сибири не найдут?". И разумеется, в коде утонет кто угодно, кроме его создателя. Наверное, в эти моменты в офисе звучит раскатистое "Буа-ха-ха", и темный джедай именно ими и живет. Подвиги нужны и необходимы не меньше, просто преступление за ними надо совершать самому. Так гораздо надежнее - у кого риск, у того и ревард.


Я же, как простой смертный, на этом и откланяюсь.
I'm just a simple man, trying to make my way through the universe (с)

P.S. Пожалуйста, не воспринимайте серьезно ;)
UPD: Клево, нашлись люди, которые восприняли!
[info]aruslan написал замечательный пост про потери светлого джедая, который выше простого негра:
http://aruslan.livejournal.com/89951.html
[info]dubor пишет о том, как проводил опрос о джедайской стороне:
http://dubor.livejournal.com/109618.html
Жжоте, мужики :)




(54 comments) - (Post a new comment)


[info]ex_darth_t413
2006-09-11 07:12 pm UTC (link)
Обнаружил, что часто захожу на Темную Сторону.
Что-ж, пойдем по данному пути дальше.
Хотя я еще падаван в лучшем случае.

(Reply to this)


[info]_winnie
2006-09-11 07:22 pm UTC (link)
Бху. Ня. Бхуха-ха-ха-га!

(Reply to this) (Thread)


[info]sim0nsays
2006-09-12 01:42 am UTC (link)
Неубедительно, Пушистый! Let the anger come!

(Reply to this) (Parent)(Thread)

(no subject) - [info]_winnie, 2006-09-12 11:43 am UTC
(no subject) - [info]sim0nsays, 2006-09-12 11:44 am UTC
(no subject) - [info]_winnie, 2006-09-12 11:53 am UTC

[info]shodan_ru
2006-09-11 07:58 pm UTC (link)
есть мнение, светлых не существует ;)

(Reply to this) (Thread)


[info]sim0nsays
2006-09-12 01:43 am UTC (link)
Да ну нафиг :)

(Reply to this) (Parent)


[info]__anubis__
2006-09-11 08:30 pm UTC (link)
!!! Круто написано :)

(Reply to this)


[info]dwarfig
2006-09-12 02:40 am UTC (link)
Погоди, а ты сам-то светлый или темный?
Подозреваю, что аццкий йокодзуна /помесь светлого джедая с темным/.

(Reply to this) (Thread)


[info]sim0nsays
2006-09-12 02:41 am UTC (link)
Там написано, я простой смертный :)

(Reply to this) (Parent)(Thread)

(no subject) - (Anonymous), 2006-09-12 05:30 am UTC
(no subject) - [info]sim0nsays, 2006-09-12 05:39 am UTC
(no subject) - (Anonymous), 2006-09-12 06:03 am UTC
(no subject) - [info]ufonaut, 2006-09-12 07:09 am UTC
(no subject) - [info]sim0nsays, 2006-09-12 07:14 am UTC
(no subject) - [info]sim0nsays, 2006-09-12 11:46 am UTC
+1 - [info]dwarfig, 2006-09-12 06:11 am UTC
(no subject) - [info]dwarfig, 2006-09-12 06:12 am UTC

[info]shader
2006-09-12 04:40 am UTC (link)
отлично написано. респект и увага =)
главное уметь сочетать правильно два подхода.

(Reply to this)


[info]ex_10chiken643
2006-09-12 05:00 am UTC (link)
У меня замашки темного, когда я работаю в графических редакторах, и светлого, когда я пишу скрипты на VBA :)
Доктор, я умру? :)

(Reply to this)


[info]zmifz
2006-09-12 06:37 am UTC (link)
Саймон, респект как обычно.
Жаль тема взаимодействия темных и светлых не раскрыта.

(Reply to this) (Thread)


[info]sim0nsays
2006-09-12 06:45 am UTC (link)
О-о-о-о, взаимодействие - отдельная песня. Именно в ней как нигде необходим форс менеджера.

(Reply to this) (Parent)


[info]cppguru
2006-09-12 08:27 am UTC (link)
Вот я тоже не умею писать гавнокод, как тёмные джедаи. Наверно, это плохо.

Насчёт энтропии, это мысль ).

(Reply to this) (Thread)


[info]neteraser
2006-09-12 09:36 am UTC (link)
писать говнокод надо уметь.
иначе непонятно (мне) кто в россии будет платить.

(Reply to this) (Parent)(Thread)

(no subject) - [info]aruslan, 2006-09-12 01:04 pm UTC
(no subject) - [info]sergey_shandar, 2006-09-13 04:55 am UTC
(no subject) - [info]neteraser, 2006-09-13 03:48 pm UTC

[info]sergey_shandar
2006-09-13 04:35 am UTC (link)
>Вот я тоже не умею писать гавнокод, как тёмные джедаи. Наверно, это плохо.

Много потерял.

(Reply to this) (Parent)


[info]myrrr
2006-09-12 08:41 am UTC (link)
многабукфниасилил:)

спроси у Ники про "оптимизацию в широком смысле":)

(Reply to this) (Thread)


[info]sim0nsays
2006-09-12 08:59 am UTC (link)
Думаешь, что-то расскажет?

(Reply to this) (Parent)(Thread)

(no subject) - [info]myrrr, 2006-09-12 02:29 pm UTC
(no subject) - [info]sim0nsays, 2006-09-13 04:47 pm UTC
(no subject) - [info]myrrr, 2006-09-13 05:58 pm UTC

[info]thesz
2006-09-12 10:55 am UTC (link)
Вот у меня похожий подход, но без стройной теории. ;)

Оптимизацией теории займусь потом. ;)

(Reply to this) (Thread)


[info]sim0nsays
2006-09-12 11:08 am UTC (link)
Какой конкретно подход-то? :)

(Reply to this) (Parent)(Thread)

(no subject) - [info]thesz, 2006-09-12 01:17 pm UTC
(no subject) - [info]sim0nsays, 2006-09-13 03:59 am UTC
(no subject) - [info]thesz, 2006-09-13 08:33 am UTC
(no subject) - [info]sim0nsays, 2006-09-13 10:43 am UTC
(no subject) - [info]thesz, 2006-09-13 11:00 am UTC
(no subject) - [info]sim0nsays, 2006-09-13 11:09 am UTC
(no subject) - [info]munchilla, 2006-09-13 12:18 pm UTC
(no subject) - [info]sim0nsays, 2006-09-13 12:47 pm UTC

[info]xplozive
2006-09-12 11:04 am UTC (link)
Пачотно, пиши еще!

P.S. А говнокод у меня на работе дай боже.. Темень прет из всех дыр.

(Reply to this)


[info]digimind
2006-09-12 08:04 pm UTC (link)
Наш выбор - оптимизить G-код после других темных джедаев.
И легко, и в скине светлого джедая можно попрохаживаться!

(Reply to this) (Thread)


[info]sim0nsays
2006-09-13 04:02 am UTC (link)
Вот уж чего никогда никому не желаю, так это разбираться в коде темного джедая. А если это еще и будет светлый джедай - то радости темного не просто будет никакого предела. "Бугага" из поста не идет ни в какое сравнение.
Это совсем-совсем не легко, и чем круче тот, кто его писал - тем хуже.

(Reply to this) (Parent)(Thread)

(no subject) - [info]digimind, 2006-09-13 05:05 am UTC
(no subject) - [info]aamonster, 2006-09-13 07:03 am UTC
(no subject) - [info]sim0nsays, 2006-09-13 10:40 am UTC
(no subject) - [info]aamonster, 2006-09-13 11:05 am UTC

[info]aamonster
2006-09-13 07:01 am UTC (link)
Респект.
Соблазнительна темная сторона силы...

(Reply to this)

Темные джедаи пишут код совсем не так...
(Anonymous)
2006-12-25 06:04 am UTC (link)
Темные джедаи как раз и пишут код так как написано в учебнике программирования за 1 класс:
Код должен быть красивым и элегантным, и не должен содеражать ничего лишнего включая комментарии так-как код должен комменитировать сам себя.
Пояснения, напрмер в цикле можно использовать переменную которая уже отработала в предыдущем цикле. То что ее имя дано для пояснения предыдущего цикла не далжно вас смущать, если это вас все таки смущает дайте ей название ударив пару раз кулаком по клавиатуре.
Такую переменную можно использовать в нескольких циклах
Все равно назначение переменной будет понятно из алгоритма работы самого цикла. Или используйте рекурсию, то что она жрет память не должно вас смущать т.к. у заказчика все равно старый парк компьютеров и он его скоро будет обновлять тогда какая ему разница до какой канфигурации обновлять? С 512mb ram на борту или 2048, он все равно в этом ничего не понимает, а пользователи(они же бухгалтеры) вас поддержат.

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

з.ы.
Не забывайте про табуляции в 3 символа

(Reply to this) (Thread)

Re: Темные джедаи пишут код совсем не так...
[info]sim0nsays
2006-12-25 07:15 am UTC (link)
Ну, это какие-то basic-техники. Правильные - включают в себя названия переменных v12, разработку архитектуры as you go, использование завуалированных квадратичных алгоритмов и т.д.

(Reply to this) (Parent)


(54 comments) - (Post a new comment)

Create an Account
Forgot your login or password?
Login w/ OpenID
English • Español • Deutsch • Русский…