Никита Синявин
Lead Flutter developer, BetBoom
Dart на максималках: низкоуровневые оптимизации высокоуровневого языка

Основная канва доклада - рассказ о серии оптимизаций 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 и является высокоуровневым ЯП, тем не менее, он позволяет производить очень тонкие оптимизации производительности вплоть до уровня оптимизации компиляции отдельных функций