71 lines
3.8 KiB
Markdown
71 lines
3.8 KiB
Markdown
# План улучшения архитектуры 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) |
|