功能價格文件部落格
取得 mote
← 部落格
工程·2026年7月5日·閱讀時間 3 分鐘

文件再長,打字也不會變慢的原因

寫簡短筆記時,任何編輯器都很快。差異會在文件變長時出現,而關鍵在於單次按鍵的成本,是隨著編輯範圍還是文件大小增加。

m
mote
在 100 KB 文件中輸入 300 個按鍵後測得的兩條線。核心完成編輯、重新解析與裝飾的時間點(p95 0.44 ms),以及結果繪製到畫面的時間點(p95 3.32 ms),是分開測量的。
在 100 KB 文件中輸入 300 個按鍵後測得的兩條線。核心完成編輯、重新解析與裝飾的時間點(p95 0.44 ms),以及結果繪製到畫面的時間點(p95 3.32 ms),是分開測量的。

簡短筆記用任何編輯器來寫都很快。差異會在文件變長時顯現。

如果每次按鍵時都重新讀取整份文件並重新配置畫面,那麼文件越長,輸入也會越慢。這就是為什麼在只有十行的筆記中還很順暢的編輯器,到了兩千行的設計文件裡就會讓人感到卡頓。

mote 沒有把這個問題視為日後再修正的效能問題。它從一開始就被定為必須遵守的設計原則。

編輯時,只重新讀取並配置變更的範圍。只有開啟檔案時才重新讀取整份文件。

只重新讀取變更之處

在 Markdown 中,前面的行可能會改變後面各行的意義。如果在文件前段開啟程式碼區塊,下面的內容可能全都變成程式碼,而同一句話在清單或引言中也會有不同的解讀。

因此,mote 會記住前方影響確定結束的「安全點」。發生編輯時,便從附近的安全點開始讀取,並在內容重新穩定的那一刻停止。

之後的區塊不會重新讀取。如果行數增加或減少,就只移動位置。這讓成本不再取決於整份文件,而是跟著實際變更的範圍走。

解析器遵循 CommonMark 的逐行演算法,並通過全部 652 項規格測試。但增量處理很容易在不知不覺中出錯。因此,我們會對隨機文件套用 3,600 次隨機編輯,並在每次編輯後,與重新讀取整份文件的結果進行比較。

這項檢查也找出了實際的錯誤。那是安全點與編輯行恰好重疊的情況。

用檢查來守住效能原則

目標是從按下按鍵到核心處理完成,p95 為 4ms。超過這個時間時,不會把它當成改善事項,而是視為錯誤處理。

規則也不只是寫在文件裡。自動檢查會確認完整重新解析只在開啟檔案時使用,也會阻止閒置狀態下反覆執行的計時器或影格工作。

效能也不由人用肉眼判斷。測試工具會在實際畫面中輸入按鍵,並測量處理時間的分布。我們看的是 p95,而不是平均值或中位數。因為讓使用者感到卡頓的,與其說是平常的速度,不如說是偶爾出現的長時間延遲。

測量時永遠使用同一份固定文件。

以即時模式開啟測試工具所使用的固定文件 doc100k.md 的畫面。狀態列顯示 96,513 個字元以及 103 分鐘的閱讀時間。
以即時模式開啟測試工具所使用的固定文件 doc100k.md 的畫面。狀態列顯示 96,513 個字元以及 103 分鐘的閱讀時間。

畫面也只變更必要的部分

只把解析器改成增量處理還不夠。

程式碼區塊的語法突顯原本會在每次編輯時重新處理所有區塊。這是最後一項不論編輯範圍大小,都會隨文件變長而變慢的工作。

現在,未修改區塊的語法突顯會直接沿用。編輯位置之後的區塊,只會依行數的變化移動位置。

畫面外的區塊不會進行版面配置。因為必須同時縮小重新讀取與重新繪製的範圍,才能在長文件中維持速度。

也有例外

有些時候必須重新處理整份文件。

例如開啟檔案或換行格式改變時。修改連結參照定義後,文件中任何位置的連結都可能改變,因此畫面更新範圍也會擴大到整份文件。

即使核心很快,畫面仍需要時間等待下一個影格。在 60Hz 畫面上,影格間隔本身就會成為極限。因此,核心處理時間與實際顯示在畫面上所需的時間會分開測量,不會把兩個數字放在同一條軸線上。這就是封面上兩條線不同的原因。

快速的編輯器,並不是把所有事情都做得很快的編輯器。

而是不做那些不必做的事情的編輯器。

← 較舊不自行繪製文字,而是交給平台處理的理由較新 →為了在其他工具中也顯示為相同段落,我們訂下了 Enter 鍵的規則
透過 RSS 持續關注。
只留下文字。
繁體中文
© 2026 mote