summarum/benchmark_editor.ts
google-labs-jules[bot] 45c73ec8ba perf: avoid expensive doc stringification for autocomplete
Refactored the autocomplete variable matching logic in `src/ui/editor.ts` to iterate through document lines using CodeMirror's `iterLines()` instead of allocating the entire document string in memory with `toString()`. Also pulled the regex up and introduced a quick `.includes("=")` bailout to skip the regex engine completely for most lines.

Co-authored-by: Horizontal42 <75383519+Horizontal42@users.noreply.github.com>
2026-08-19 11:31:19 +00:00

51 lines
1.5 KiB
TypeScript

import { EditorState } from "@codemirror/state";
const lines = [];
for (let i = 0; i < 500000; i++) {
lines.push(`some_var_${i} = ${i * 10} + 5`);
}
const text = lines.join('\n');
const state = EditorState.create({ doc: text });
function benchmarkOld() {
const start = performance.now();
const options = [];
const docText = state.doc.toString();
for (const m of docText.matchAll(/^\s*([\p{L}_][\p{L}\d_]*)\s*=/gmu)) {
options.push({ label: m[1], type: "variable" });
}
const end = performance.now();
return end - start;
}
const pattern = /^\s*([\p{L}_][\p{L}\d_]*)\s*=/u;
function benchmarkRegexPerLine() {
const start = performance.now();
const options = [];
const iter = state.doc.iterLines();
for (let next = iter.next(); !next.done; next = iter.next()) {
const line = next.value;
// Optimization: checking '=' first is significantly faster than firing regex blindly
if (line.includes('=')) {
const m = pattern.exec(line);
if (m) {
options.push({ label: m[1], type: "variable" });
}
}
}
const end = performance.now();
return end - start;
}
benchmarkOld();
benchmarkRegexPerLine();
let oldTotal = 0;
let newTotal = 0;
for (let i = 0; i < 10; i++) {
oldTotal += benchmarkOld();
newTotal += benchmarkRegexPerLine();
}
console.log(`Old avg: ${oldTotal / 10} ms`);
console.log(`Regex per line with '=' check avg: ${newTotal / 10} ms`);