# План улучшения архитектуры 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` в стилях не тронут — `ComputedStyle::compute()` и `parse_*()` всё ещё принимают `&str`. Стили — главный потребитель parse/format. - [ ] **1.2** Заменить `HashMap` на `HashMap` в стилях: - `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`, селекторы — `String`. Сравнения — через `==`. - [ ] **2.2** Заменить `&'a str` на `InternedStr` в `Element::type_name` и ключах - [ ] **2.3** `lookup()` в `style.rs` — сравнение через ID вместо `==` - [ ] **2.4** `CompoundSelector::matches_element()` — сравнение через InternedStr - [ ] **2.5** `HashMap` → `HashMap` где ключи повторяются --- ## Фаза 9.3: Кэш Iced-виджетов **Цель:** не пересоздавать `iced::Element` для элементов с неизменившимся `content_hash`. **Статус:** 9.1 (`content_hash` на `Element`) и 9.2 (стабильные `iced::widget::Id`) сделаны. 9.3 отложен: `iced::Element` не `Clone`, хранит `Box`, кэширование требует unsafe transmute lifetime или перестройки renderer. - [ ] **9.3** Реализовать кэш `HashMap` в `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) |