41
Оптимизация: на грани и за Антон Патрушев PyCon Russia, 19/09/2015

Оптимизация на грани и за ней - Антон Патрушев, UNFCCC

Embed Size (px)

Citation preview

Page 1: Оптимизация на грани и за ней - Антон Патрушев, UNFCCC

Оптимизация: на грани и за

Антон ПатрушевPyCon Russia, 19/09/2015

Page 2: Оптимизация на грани и за ней - Антон Патрушев, UNFCCC

О себе

• Highload на Python и C++– Noda Interaction Platforms (ex-CTO)

• PyCon Russia• РКИК ООН– Python/Java/JavaScript

Page 3: Оптимизация на грани и за ней - Антон Патрушев, UNFCCC

Disclaimer

• Этот доклад содержит опасные хаки• Не делайте так никогда• Если сделаете – не ссылайтесь на меня• В блоках кода не Python, а псевдокод• Всё что здесь написано - выдумка

Page 4: Оптимизация на грани и за ней - Антон Патрушев, UNFCCC

Жалобы от мам, жён и тимлидов о том что вы вернулись с конференции «какой-то другой»

НЕ ПРИНИМАЮТСЯ

Page 5: Оптимизация на грани и за ней - Антон Патрушев, UNFCCC

Признание

• Мы так дела(ем|ли)• Нам сначала было немножко больно• Потом стало хорошо

Page 6: Оптимизация на грани и за ней - Антон Патрушев, UNFCCC

О докладе

• Про GC– Коротко о сборке мусора– Когда GC это боль?– Жизнь без GC: есть ли она?

• {Про AST, Про байткод}– Intro– Разоблачение

Page 7: Оптимизация на грани и за ней - Антон Патрушев, UNFCCC

Сборка мусора

• Счётчик ссылок– Часть объекта– Увеличиваем/уменьшаем– Если равен нулю удаляем (или gc.garbage)– Каскадно уменьшаем счётчики

• GC– Ищем изолированные циклы– Cносим их целиком

Page 8: Оптимизация на грани и за ней - Антон Патрушев, UNFCCC

Real-time

• Мягкий– «лучше бы не опаздывать»– Подходит когда «на той стороне» человек

• Жёсткий– Опоздание == DOS– Больше относится к взаимодействию между

компонентами систем

Page 9: Оптимизация на грани и за ней - Антон Патрушев, UNFCCC

GC

• Когда запустится – не известно– Gen(0)=>(allocates – deallocates)– Gen(x)=>num(Gen(x-1))

• Сколько будет длиться – не известно– Зависит от количества объектов

Page 10: Оптимизация на грани и за ней - Антон Патрушев, UNFCCC

All your CPUs are belongs to GC

Page 11: Оптимизация на грани и за ней - Антон Патрушев, UNFCCC

Есть ли жизнь без GC? Финализируйте объекты явно

Explicit is better than implicit Следите за памятью

gc.get_count()[0] Ловите циклы

gc.set_debug(gc.DEBUG_SAVEALL) gc.collect(0) gc.garbage

Page 12: Оптимизация на грани и за ней - Антон Патрушев, UNFCCC

Есть ли жизнь без GC? Сделайте бэкдор в своё приложение (!!!)

twisted.manhole rfoo.utils.rconsole pydevd (теоретически) возможно подключиться GDB

Включите в установку objgraph

Page 13: Оптимизация на грани и за ней - Антон Патрушев, UNFCCC

Цикл

Page 14: Оптимизация на грани и за ней - Антон Патрушев, UNFCCC

Цикл

Page 15: Оптимизация на грани и за ней - Антон Патрушев, UNFCCC

Цикл: решение

• Явная финализация– Room.close()– Client.leave(room)

Page 16: Оптимизация на грани и за ней - Антон Патрушев, UNFCCC

Поиск циклов

Page 17: Оптимизация на грани и за ней - Антон Патрушев, UNFCCC

Неожиданные циклы

Page 18: Оптимизация на грани и за ней - Антон Патрушев, UNFCCC

Неожиданные циклы: Closure

Page 19: Оптимизация на грани и за ней - Антон Патрушев, UNFCCC

Неожиданные циклы

Page 20: Оптимизация на грани и за ней - Антон Патрушев, UNFCCC

Если явно не выходит

• weakref

Page 21: Оптимизация на грани и за ней - Антон Патрушев, UNFCCC

Опасный трюк с id

Page 22: Оптимизация на грани и за ней - Антон Патрушев, UNFCCC

Objgraph ваш друг

• find_{ref,backref}_chain• show_growth• show_most_common_types

Page 23: Оптимизация на грани и за ней - Антон Патрушев, UNFCCC

С такими друзьями врагов не надо

Page 24: Оптимизация на грани и за ней - Антон Патрушев, UNFCCC

Повышаем градус безумия

Page 25: Оптимизация на грани и за ней - Антон Патрушев, UNFCCC

Logging: mission impossible

• Вычисление аргументов• Вызов и передача параметров• «Паразитная» информация при

профилировании• Касается многих языков

Page 26: Оптимизация на грани и за ней - Антон Патрушев, UNFCCC

Logging: как быть?

• Переписать весь код так

• Читаемость?• Накладные расходы?• Большая база кода?

Page 27: Оптимизация на грани и за ней - Антон Патрушев, UNFCCC

А что если…

• Каким-то образом на старте программы взять и вырезать ненужные уровни логирования?

Page 28: Оптимизация на грани и за ней - Антон Патрушев, UNFCCC

Abstract Syntax Tree

• Машиночитаемое представление исходного кода

• Дерево• Source=>AST=>bytecode• Преобразования необратимы• AST->AST->AST->….– visitor

Page 29: Оптимизация на грани и за ней - Антон Патрушев, UNFCCC
Page 30: Оптимизация на грани и за ней - Антон Патрушев, UNFCCC

Logging: AST-transformation

• Possibly impossible is possible• Import hook• Полное вырезание отключенных уровней• Ограничения– Все вызовы должны выглядеть одинаково– LogLevel нельзя будет сменить без рестарта

Page 31: Оптимизация на грани и за ней - Антон Патрушев, UNFCCC
Page 32: Оптимизация на грани и за ней - Антон Патрушев, UNFCCC

Ещё разок про плюсы

• Плюсы это такой язык программирования• Вызов логирования исчезает полностью• Не надо править код• Профилирование• «Дополнительная» производительность в

«экстремальных» режимах работы

Page 33: Оптимизация на грани и за ней - Антон Патрушев, UNFCCC

Let’s get deeper

Page 34: Оптимизация на грани и за ней - Антон Патрушев, UNFCCC

bytecode

• Следующее преобразование– AST=>bytecode

• Язык CPython VM• Батарейки– Dis– byteplay

Page 35: Оптимизация на грани и за ней - Антон Патрушев, UNFCCC
Page 36: Оптимизация на грани и за ней - Антон Патрушев, UNFCCC

LOAD_CONST vs LOAD_GLOBAL

• Dict vs List[x]

Page 37: Оптимизация на грани и за ней - Антон Патрушев, UNFCCC

Bytecode-transformation

• Общий принцип– Ищем в co_code LOAD_GLOBAL– Добавляем её аргумент в co_consts– Меняем инструкцию на LOAD_CONST

• Import hook– Глобальные оптимизации

• Decorator– Локализация изменений

Page 38: Оптимизация на грани и за ней - Антон Патрушев, UNFCCC

Bytecode: результаты

• Абослютного значения нет• Для такого кода

• Время выполнения меньше на 12-15%

Page 39: Оптимизация на грани и за ней - Антон Патрушев, UNFCCC

Bytecode/AST

• Производительность без изменения кода• «Отключаемые» улучшения

Page 40: Оптимизация на грани и за ней - Антон Патрушев, UNFCCC

Здесь должны быть ссылки

• http://compilers.pydata.org/• https://github.com/apatrushev/bycot

Page 41: Оптимизация на грани и за ней - Антон Патрушев, UNFCCC

Это всё.

Вопросы[email protected]