Files
Glint-Runtime/ARCHITECTURE-IMPROVEMENT-PLAN.md

71 lines
3.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# План улучшения архитектуры 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) |