perf(finder,orphan): 第一層掃描提速——category 記憶化(S3)+orphan 葉塊預計算(S2),保行為
下游效能訴求一(掃描疑 O(n²))之第一層:無狀態、保行為、無公開 API 變更之確定收益。 S3 category 記憶化:finder.category 以 categoryCache(WeakMap<Element, InlineCategory>)記憶化,砍 除 collectRuns/jiyaAdjacency/jinze/split 跨 pass 對同一元素之重複 el.matches()(pill/isolate/ avoid 選擇器)。安全:單次 render 內一元素之分類恆定(class/skip 屬性/nodeName 不因 render 變更; jz-* 包裹按 nodeName 分類亦恆定),且 Finder 隨 makeCtx 每次 render 重建 → 快取僅存活單次 render、 無跨 render 失效(持久化屬 C1,另議)。亲驗(正確補 Element.prototype.matches):pill/isolate 密集 頁面 el.matches() 8204→5842(約降三成);暫禁快取則 computeCategory 2322 vs 1041(命中率 55%)。 S2 orphan 葉塊預計算:以一趟上攀預計算「非葉塊」Set 取代逐塊 block.querySelector(sel) 掃整棵子樹之 O(Σ塊子樹)(深塊嵌套下 O(n²));某塊為另一塊之最近塊祖先 ⟺ 含塊級後代,scope 無涉、與原 querySelector 同口徑,行為等價。sel 亦外提出迴圈。 測試 129→130(+1 鎖定 S2 非葉塊等價:含巢狀塊之容器跳過、僅內層葉塊綁定);全綠、輸出不變。 文檔:ARCHITECTURE §4.1(category 記憶化)+§6.5.1(orphan 葉塊預計算)。 新發現(待議、非本層):剩餘 el.matches() 之最大來源為 insidePill 之「逐文本節點沿祖先鏈 pillMatches」 (eachTextNode 每文本節點一趟、未記憶化)——可作下一項提速機會。
This commit is contained in:
@@ -257,6 +257,12 @@ Nvim peek/Claude 模板等 v1 消費端之過渡期。**最後一批 v1 消費
|
||||
`jiyaAdjacency`/`isTransparent`)皆 `switch(category)` 分派,`canSplit` = `SPLITTABLE ∩ transparent`
|
||||
——分類集中一處、優先序不再散落各原語各自短路(階段二後之清晰化)。
|
||||
|
||||
**效能(S3 記憶化)**:分類含至多三次 `el.matches()`(pill/isolate/avoid 選擇器),且被上列各遍歷
|
||||
原語逐元素、跨 pass 重算——`category` 以 `categoryCache`(`WeakMap<Element, InlineCategory>`)記憶化,
|
||||
砍除跨 pass 重複(實測 pill/isolate 密集之頁面 `el.matches()` 約降三成)。安全性:單次 render 內一元素
|
||||
之分類恆定(class/skip 屬性/nodeName 皆不因 render 變更;jz-* 包裹按 nodeName 分類亦恆定),且 Finder
|
||||
隨 `makeCtx` 每次 render 重建 → 快取僅存活單次 render、無跨 render 失效問題(持久化屬另議)。
|
||||
|
||||
判定**以元素為準、非標籤名**(`isTransparent(el) = category(el)==="transparent"`,前置排除 pill/
|
||||
isolate/avoid
|
||||
再查標籤集):KaTeX 全樹皆 `<span>`,舊版按標籤名判透明曾令 `canSplit`/`descend`
|
||||
@@ -638,6 +644,10 @@ class 約定:`bd`(標點)、`bd-open/close/cop/stop/sep/liga`、`cjk`、`j
|
||||
- **選項**:`orphan?: boolean | { chars?: number }`(feature gate;**預設開 chars=2**;per-block
|
||||
經 `blocks`/`data-jz`;段落級,`data-jz-level="text"` 子樹跳過)。lang 無關。
|
||||
- **邊界**:段落實義字 < N → 不綁。極窄容器(<N 字寬)→ 整體可能溢出(罕見,文檔提示)。
|
||||
- **僅葉塊**:含塊級後代之容器(其實義字屬內層段落)跳過、另由內層處理。**效能(S2)**:舊版
|
||||
逐塊 `block.querySelector(sel)` 掃整棵子樹判葉塊,累加 O(Σ塊子樹)、深塊嵌套下 O(n²);改以一趟
|
||||
上攀預計算「非葉塊」Set(某塊為另一塊之最近塊祖先 ⟺ 含塊級後代),scope 無涉、與原 querySelector
|
||||
同口徑,行為等價。
|
||||
- **order=70**(charify 20 後、layout pass 前;longWord 60 後)。
|
||||
- **與禁則協同**:段末範圍可能含 jinze 已綁之 `jz-jinze`;置於 jinze(40) 後,將 jz-jinze 整體
|
||||
納入 jz-orphan,並處理邊界字定位**跨 jz-jinze 攀爬**(實作細節)。免重複包裹。
|
||||
|
||||
Reference in New Issue
Block a user