3.8 KiB
План улучшения архитектуры Glint Runtime — остаток
Всё, что не реализовано из исходного плана. Реализованные фазы (3-8, 10, 9.1-9.2) удалены.
Фаза 0: Бенчмарки и профилирование
Цель: зафиксировать текущие метрики, чтобы объективно оценивать прогресс.
- 0.3 Запустить
perf record/flamegraph-rsна горячем пути и выявить bottleneck - 0.4 Записать baseline в
BENCHMARKS.mdилиREADME.md
Фаза 1: Типизированные значения (Value enum)
Цель: устранить постоянный round-trip через строки (parse/format на каждое свойство).
Статус: Value enum, конверсии Value↔Dynamic и resolve_string с Value сделаны.
Осталось: HashMap<String, String> в стилях не тронут — ComputedStyle::compute() и
parse_*() всё ещё принимают &str. Стили — главный потребитель parse/format.
- 1.2 Заменить
HashMap<String, String>наHashMap<String, Value>в стилях:StyleRule::properties- Все matched_sheets
- 1.8 Переписать
parse_color,parse_size,parse_lengthна работу с&Value - 1.9 Написать тесты для Value: конверсии, сравнения, форматирование
Фаза 2: Интернирование строк (String Interning)
Цель: ускорить сравнение строк (ключи свойств, названия типов, классы).
Заменить миллион == "padding-top" на O(1) сравнение ID.
Статус: InternedStr(u32) и Interner определены в types.rs, но нигде не используются
в горячем пути. Element::type_name — &str, ключи пропертей — Cow<str>,
селекторы — String. Сравнения — через ==.
- 2.2 Заменить
&'a strнаInternedStrвElement::type_nameи ключах - 2.3
lookup()вstyle.rs— сравнение через ID вместо== - 2.4
CompoundSelector::matches_element()— сравнение через InternedStr - 2.5
HashMap<String, String>→HashMap<InternedStr, Value>где ключи повторяются
Фаза 9.3: Кэш Iced-виджетов
Цель: не пересоздавать iced::Element для элементов с неизменившимся content_hash.
Статус: 9.1 (content_hash на Element) и 9.2 (стабильные iced::widget::Id) сделаны.
9.3 отложен: iced::Element не Clone, хранит Box<dyn Widget>, кэширование требует
unsafe transmute lifetime или перестройки renderer.
- 9.3 Реализовать кэш
HashMap<ElementId, (u64, iced::Element)>вGlintApp:- При совпадении
content_hash— возвращать сохранённый виджет - Иначе — рендерить, кэшировать, обновлять hash
- Unsafe transmute
'static → '_допустим, т.к. данные живут вElement<'static>
- При совпадении
Сводная таблица — остаток
| Фаза | Описание | Оценка ускорения |
|---|---|---|
| 0 | Профилирование | — |
| 1 | Value enum в стилях | 2-3× |
| 2 | String interning | 1.5-2× |
| 9.3 | Кэш виджетов | 1.5-2× (render) |