Основная канва доклада - рассказ о серии оптимизаций Duit (BDUI-фреймворка), целью которых было избавиться от лишних аллокаций объектов при обновлениях/анимациях и максимально сократить время парсинга данных.
Основные тезисы:
1. Проблема атрибутов - некорректное копирование, лишние аллокации в анимациях и сложность управления состоянием, нагрузка на GC.
2. Обоснование выбора и применение подходящей структуры данных (Map) вместо классов атрибутов и почему тип Map способен разом убить нескольких зайцев
3. Extension types - рассуждения о "непопулярной" фиче языка, о роли ET в организации доступа к типизированным данным в контексте задачи
4. Оптимизация 1 - Map cache. Парсинг и кеширование результатов выполнения силами Map.
5. Разбор результатов 1 оптимизации - не только zero-cost, но и zero-allocation, сравнение результатов до/после (кол-во аллокаций), прироста производительности
6. Ныряем глубже. Блок про основные типы вызовов в Dart, аннотацию @pragma('vm:prefer-inline') и как писать код, который с высокой долей вероятности будет заинлайнен (с примерами), разбор того, за счет чего заинлайненная функция выполняется быстрее.
7. Результат 2: Сравнение времени выполнения двух функций (инлайн и не-инлайн вариантов), оценка разницы в производительности (15-30%)
8. На дно! Заставляем компилятор генерировать оптимальный ассемблерный код. В рамках блока будет рассмотрена серия оптимизаций одной из функций (для парсинга примитивных типов данных в типы Dart/Flutter):
- Рассмотрение базовой реализации, анализ инструкций ассемблера
- Модификация функции (const lookup tables), кратко о том, почему это эффективнее (время доступа и почему const переменные эффективнее non-const). Рассмотрение того, что изменилось на уровне инструкций, ветвлений, работе с кешем, регистрами и тд.
- Модификация функции (убираем выразительность кода). Как красивый код может сделать функции менее эффективной.
9. Сравнение основных показателей 3-х функций, описание разницы и примененных оптимизаций.
10. Выводы 1: что мы получили после всех манипуляций
11. Выводы 2: неочевидные бенефиты для проекта (снижение объема кодовой базы, снижение сложности кодовой базы и меньшее количество "точек отказа", упрощение API кастомных виджетов)
12. О Duit v4. Небольшое представление мажорного обновления проекта. Рассказываю о том, что в ближайшее время этого в проде не будет. Текущая реализация имеет недостатки, но стабильна и сможет развиваться некоторое время; Для миграции необходимо нарастить покрытие кода тестами, чтобы эффективно отлавливать проблемы и обеспечить отказоустойчивость; Breaking changes в рамках фичи обязывают готовить мажорный релиз; В релизе хочется дополнительно собрать другие ломающие изменения в фреймворке и DSL; Необходимость переработки документации
13. Финальные выводы: хоть Dart и является высокоуровневым ЯП, тем не менее, он позволяет производить очень тонкие оптимизации производительности вплоть до уровня оптимизации компиляции отдельных функций