Cache parsed components for 10x faster startup (2s → 200ms)
- Fix O(n²) postprocessing: compute_all_deps/io_refs/hash were called per-file (92x for sx app). Now deferred to single finalize_components() call after all files load. - Add pickle cache in shared/sx/.cache/ keyed by file mtimes+sizes. Cache stores fully-processed Component/Island/Macro objects with deps, io_refs, and css_classes pre-computed. Closures stripped before pickle, rebuilt from global env after restore. - Smart finalization: cached loads skip deps/io_refs recomputation (already in pickle), only recompute component hash. - Fix ~sx-header → ~layouts/header ref in docs-content.sx Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -13,14 +13,18 @@ from .jinja_bridge import load_sx_dir, register_reload_callback, watch_sx_dir
|
||||
|
||||
|
||||
def load_shared_components() -> None:
|
||||
"""Register all shared s-expression components."""
|
||||
"""Register all shared s-expression components.
|
||||
|
||||
Defers finalization (deps/hash) so the calling app can load service
|
||||
components before the single finalize pass.
|
||||
"""
|
||||
# Load SX libraries first — reader macros (#z3 etc.) must resolve
|
||||
# before any .sx file that uses them is parsed
|
||||
_load_sx_libraries()
|
||||
register_reload_callback(_load_sx_libraries)
|
||||
|
||||
templates_dir = os.path.join(os.path.dirname(__file__), "templates")
|
||||
load_sx_dir(templates_dir)
|
||||
load_sx_dir(templates_dir, _finalize=False)
|
||||
watch_sx_dir(templates_dir)
|
||||
|
||||
|
||||
@@ -32,4 +36,4 @@ def _load_sx_libraries() -> None:
|
||||
path = os.path.join(ref_dir, name)
|
||||
if os.path.exists(path):
|
||||
with open(path, encoding="utf-8") as f:
|
||||
register_components(f.read())
|
||||
register_components(f.read(), _defer_postprocess=True)
|
||||
|
||||
Reference in New Issue
Block a user