mirror of
https://github.com/nesquena/hermes-webui.git
synced 2026-05-25 11:10:18 +00:00
6333a06524
renderMessages() tears down and rebuilds every message's DOM from scratch on every call — renderMd() (markdown parse), Prism highlight, and KaTeX per message, O(n) total. With large sessions the main thread blocks for 1-5 seconds on each call. A Chrome perf trace (78s, many open sessions) showed: - 9,373ms of GC across 34,049 GC events (sustained, not burst) - Peak 273 messages.js FunctionCalls/second - 4.7s, 3.5s, 3.2s main-thread blocks from repeated renderMessages invocations The render bottleneck is unaddressed by PR #959 (which improves the network/ parse leg of session switching, not the render leg). Fix: a session-keyed innerHTML cache. After a full rebuild, the rendered HTML is stored against the session_id + message count. When switching back to a session that was already rendered with the same count, the DOM is restored from cache (fast innerHTML set + re-highlight) instead of rebuilt from scratch. Guard: the cache is only used on cross-session navigation (sid !== current). In-session updates (new messages, edits, tool_complete, stream events) always get a full rebuild — no stale content is ever shown. Cache is capped at 30 sessions and evicts oldest-first to bound memory. Co-authored with Claude Sonnet 4.6 / Anthropic.