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

3.8 KiB
Raw Blame History

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