From 8eea2524cc223564f3d94a666ceb4a39e8963ecf Mon Sep 17 00:00:00 2001 From: HAL <68320771+HALQME@users.noreply.github.com> Date: Mon, 15 Dec 2025 00:26:53 +0900 Subject: [PATCH 01/12] Add runtime profiler and perf-budget tests --- README.md | 16 + package.json | 2 + packages/btuin/src/index.ts | 3 +- packages/btuin/src/layout/focus.ts | 4 +- packages/btuin/src/layout/index.ts | 16 +- packages/btuin/src/layout/renderer.ts | 16 - packages/btuin/src/runtime/app.ts | 13 + packages/btuin/src/runtime/index.ts | 6 + .../btuin/src/runtime/platform-adapter.ts | 1 - packages/btuin/src/runtime/profiler.ts | 368 ++ packages/btuin/src/runtime/render-loop.ts | 68 +- .../btuin/src/runtime/terminal-adapter.ts | 1 - packages/btuin/src/view/primitives/spacer.ts | 1 - packages/btuin/tests/layout/zstack.test.ts | 6 +- .../tests/view/primitives/spacer.test.ts | 1 - packages/renderer/src/diff.ts | 37 +- packages/renderer/tests/diff.test.ts | 35 +- packages/showcase/dashboard.ts | 19 +- packages/terminal/tests/raw.test.ts | 8 +- profiles/layout-1765733911613.json | 3022 ++++++++++++++++ profiles/stress-1765732169537.json | 3023 +++++++++++++++++ profiles/stress-1765733920188.json | 3023 +++++++++++++++++ scripts/profiler-core.ts | 495 +-- scripts/profiler-layout.test.ts | 125 + scripts/profiler-stress.test.ts | 90 + 25 files changed, 9966 insertions(+), 433 deletions(-) create mode 100644 packages/btuin/src/runtime/index.ts create mode 100644 packages/btuin/src/runtime/profiler.ts create mode 100644 profiles/layout-1765733911613.json create mode 100644 profiles/stress-1765732169537.json create mode 100644 profiles/stress-1765733920188.json create mode 100644 scripts/profiler-layout.test.ts create mode 100644 scripts/profiler-stress.test.ts diff --git a/README.md b/README.md index d53abbd..3fe67be 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,22 @@ bun packages/showcase/counter.ts bun packages/showcase/dashboard.ts ``` +### Profiling / Perf Regression + +```bash +# 大量要素のストレス(JSON出力、--io=off で stdout を捨てて純粋な計算寄りに) +bun run profile:stress --n=10000 --frames=120 --io=off --out=profiles/stress.json + +# パフォーマンス予算テスト(将来的にCIで回帰検知に使う想定) +# 例: まずは計測してから budget を詰めるのがおすすめ +bun run perf:budget --task=frame --n=10000 --iterations=30 --out=profiles/budget.json +bun run perf:budget --task=diff --rows=200 --cols=400 --iterations=20 --out=profiles/budget-diff.json + +# bun test に載せる場合(CI or BTUIN_PERF=1 のときのみ実行) +CI=1 bun run test:perf +# 予算/サイズは env で上書き可能(例: BTUIN_BUDGET_FRAME_P95=120 など) +``` + ## 使い方(最小例) ```ts diff --git a/package.json b/package.json index c8134cc..2a2c60f 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,8 @@ "format": "oxfmt packages/*", "test:all": "bun test packages", "test": "bun test packages/btuin packages/layout-engine packages/reactivity packages/renderer packages/terminal", + "profile:stress": "bun test scripts/profiler-stress.test.ts", + "profile:layout": "bun test scripts/profiler-layout.test.ts", "check": "bunx tsc --noEmit" }, "devDependencies": { diff --git a/packages/btuin/src/index.ts b/packages/btuin/src/index.ts index 273f52a..1d97de8 100644 --- a/packages/btuin/src/index.ts +++ b/packages/btuin/src/index.ts @@ -2,8 +2,7 @@ * btuin core entry point */ -export * from "./runtime/app"; -export * from "./runtime/error-boundary"; +export * from "./runtime"; export * from "./view/components"; diff --git a/packages/btuin/src/layout/focus.ts b/packages/btuin/src/layout/focus.ts index ad3a8dc..7aeaa77 100644 --- a/packages/btuin/src/layout/focus.ts +++ b/packages/btuin/src/layout/focus.ts @@ -63,6 +63,8 @@ export function collectFocusTargetMap( effectiveKey: string | undefined = element.key, ): Map { const map = new Map(); - visitFocusTargets(element, layoutMap, parentX, parentY, effectiveKey, (t) => map.set(t.focusKey, t)); + visitFocusTargets(element, layoutMap, parentX, parentY, effectiveKey, (t) => + map.set(t.focusKey, t), + ); return map; } diff --git a/packages/btuin/src/layout/index.ts b/packages/btuin/src/layout/index.ts index c5712c2..38f9491 100644 --- a/packages/btuin/src/layout/index.ts +++ b/packages/btuin/src/layout/index.ts @@ -42,7 +42,12 @@ function percentToNumber(value: string, base: number): number { return (base * n) / 100; } -function resolvePadding(padding: unknown): { top: number; right: number; bottom: number; left: number } { +function resolvePadding(padding: unknown): { + top: number; + right: number; + bottom: number; + left: number; +} { if (typeof padding === "number") { return { top: padding, right: padding, bottom: padding, left: padding }; } @@ -89,10 +94,13 @@ function viewElementToLayoutNode( if (node.width !== undefined) node.width = resolveDimension(node.width, baseWidth); if (node.height !== undefined) node.height = resolveDimension(node.height, baseHeight); if (node.minWidth !== undefined) node.minWidth = resolveDimension(node.minWidth, baseWidth); - if (node.minHeight !== undefined) node.minHeight = resolveDimension(node.minHeight, baseHeight); + if (node.minHeight !== undefined) + node.minHeight = resolveDimension(node.minHeight, baseHeight); if (node.maxWidth !== undefined) node.maxWidth = resolveDimension(node.maxWidth, baseWidth); - if (node.maxHeight !== undefined) node.maxHeight = resolveDimension(node.maxHeight, baseHeight); - if (node.flexBasis !== undefined) node.flexBasis = resolveDimension(node.flexBasis, baseWidth); + if (node.maxHeight !== undefined) + node.maxHeight = resolveDimension(node.maxHeight, baseHeight); + if (node.flexBasis !== undefined) + node.flexBasis = resolveDimension(node.flexBasis, baseWidth); } const pad = resolvePadding(node.padding); diff --git a/packages/btuin/src/layout/renderer.ts b/packages/btuin/src/layout/renderer.ts index 8a7b87c..63d8806 100644 --- a/packages/btuin/src/layout/renderer.ts +++ b/packages/btuin/src/layout/renderer.ts @@ -2,22 +2,6 @@ import { type ViewElement, isBlock, isText } from "../view/types/elements"; import type { ComputedLayout } from "@btuin/layout-engine"; import { type Buffer2D, drawText, fillRect } from "@btuin/renderer"; -function resolvePadding(padding: unknown): { top: number; right: number; bottom: number; left: number } { - if (typeof padding === "number") { - return { top: padding, right: padding, bottom: padding, left: padding }; - } - if (Array.isArray(padding) && padding.length === 4) { - const [top, right, bottom, left] = padding as number[]; - return { - top: typeof top === "number" ? top : 0, - right: typeof right === "number" ? right : 0, - bottom: typeof bottom === "number" ? bottom : 0, - left: typeof left === "number" ? left : 0, - }; - } - return { top: 0, right: 0, bottom: 0, left: 0 }; -} - /** * Draw the element tree to the buffer. */ diff --git a/packages/btuin/src/runtime/app.ts b/packages/btuin/src/runtime/app.ts index 8628e50..b50e972 100644 --- a/packages/btuin/src/runtime/app.ts +++ b/packages/btuin/src/runtime/app.ts @@ -15,6 +15,7 @@ import { createRenderer } from "./render-loop"; import { createErrorHandler, createErrorContext } from "./error-boundary"; import { createDefaultTerminalAdapter, type TerminalAdapter } from "./terminal-adapter"; import { createDefaultPlatformAdapter, type PlatformAdapter } from "./platform-adapter"; +import { Profiler, type ProfileOptions } from "./profiler"; export interface AppConfig { /** @@ -61,6 +62,11 @@ export interface AppConfig { * Optional platform adapter (process hooks/exit). */ platform?: PlatformAdapter; + + /** + * Optional profiler configuration. + */ + profile?: ProfileOptions; } export interface AppInstance { @@ -135,6 +141,7 @@ export function createApp(config: AppConfig): AppInstance { let isUnmounting = false; const term = config.terminal ?? createDefaultTerminalAdapter(); const platform = config.platform ?? createDefaultPlatformAdapter(); + const profiler = new Profiler(config.profile ?? {}); // Convert config to component definition const rootComponent = defineComponent({ @@ -214,6 +221,7 @@ export function createApp(config: AppConfig): AppInstance { }, getState: () => ({}), handleError, + profiler: profiler.isEnabled() ? profiler : undefined, }); // Create reactive render effect @@ -265,10 +273,12 @@ export function createApp(config: AppConfig): AppInstance { platform.onExit(exitHandler); platform.onSigint(() => { exitHandler(); + profiler.flushSync(); platform.exit(0); }); platform.onSigterm(() => { exitHandler(); + profiler.flushSync(); platform.exit(0); }); } catch (error) { @@ -306,6 +316,9 @@ export function createApp(config: AppConfig): AppInstance { // Dispose console capture term.disposeSingletonCapture(); + // Persist profile results (if enabled) + profiler.flushSync(); + // Clean up terminal term.cleanupWithoutClear(); diff --git a/packages/btuin/src/runtime/index.ts b/packages/btuin/src/runtime/index.ts new file mode 100644 index 0000000..5ea2914 --- /dev/null +++ b/packages/btuin/src/runtime/index.ts @@ -0,0 +1,6 @@ +export * from "./app"; +export * from "./error-boundary"; +export * from "./platform-adapter"; +export * from "./terminal-adapter"; +export * from "./profiler"; +export * from "./render-loop"; diff --git a/packages/btuin/src/runtime/platform-adapter.ts b/packages/btuin/src/runtime/platform-adapter.ts index bf2a43d..c527a25 100644 --- a/packages/btuin/src/runtime/platform-adapter.ts +++ b/packages/btuin/src/runtime/platform-adapter.ts @@ -25,4 +25,3 @@ export function createDefaultPlatformAdapter(): PlatformAdapter { }, }; } - diff --git a/packages/btuin/src/runtime/profiler.ts b/packages/btuin/src/runtime/profiler.ts new file mode 100644 index 0000000..1260103 --- /dev/null +++ b/packages/btuin/src/runtime/profiler.ts @@ -0,0 +1,368 @@ +import type { Buffer2D } from "@btuin/renderer"; +import * as fsSync from "node:fs"; +import * as path from "node:path"; + +export interface ProfileOptions { + /** + * Enable profiling. + * @default false + */ + enabled?: boolean; + + /** + * Draw a small HUD overlay into the terminal output. + * HUD uses the previous frame's metrics (so it doesn't perturb timings too much). + * @default false + */ + hud?: boolean; + + /** + * Output file path to write JSON results on unmount. + * When omitted, results are kept in memory only. + */ + outputFile?: string; + + /** + * Stop collecting after N frames (still flushes on unmount). + * When exceeded, newer frames are ignored. + */ + maxFrames?: number; + + /** + * Collect a per-frame node count (walks the view tree each frame). + * Useful for debugging but can be expensive for very large trees. + * @default false + */ + nodeCount?: boolean; +} + +export interface FrameMetrics { + id: number; + time: number; // epoch ms + rows: number; + cols: number; + nodeCount?: number; + outputBytes?: number; + diffCellsChanged?: number; + diffOps?: number; + diffCursorMoves?: number; + diffStyleChanges?: number; + diffResets?: number; + diffFullRedraw?: boolean; + layoutMs: number; + renderMs: number; + diffMs: number; + writeMs: number; + frameMs: number; + memory?: { + rss: number; + heapTotal: number; + heapUsed: number; + external: number; + }; +} + +export interface ProfileOutput { + version: 1; + startedAt: string; + endedAt: string; + frames: FrameMetrics[]; + summary: { + frameCount: number; + frameMs: { p50: number; p95: number; p99: number; max: number }; + totals: { + layoutMs: number; + renderMs: number; + diffMs: number; + writeMs: number; + frameMs: number; + }; + }; +} + +function percentile(sorted: number[], p: number): number { + if (sorted.length === 0) return 0; + const idx = Math.min(sorted.length - 1, Math.max(0, Math.floor((sorted.length - 1) * p))); + return sorted[idx] ?? 0; +} + +function tryMemoryUsage(): + | { rss: number; heapTotal: number; heapUsed: number; external: number } + | undefined { + try { + const m = process.memoryUsage(); + return { rss: m.rss, heapTotal: m.heapTotal, heapUsed: m.heapUsed, external: m.external }; + } catch { + return undefined; + } +} + +function tryByteLength(output: string): number { + try { + // Node/Bun compatible. + return Buffer.byteLength(output, "utf8"); + } catch { + return output.length; + } +} + +export class Profiler { + readonly options: Required> & + Omit & { enabled: boolean; nodeCount: boolean }; + + private startedAt = new Date(); + private frames: FrameMetrics[] = []; + private frameSeq = 0; + private lastFrame: FrameMetrics | null = null; + + constructor(options: ProfileOptions) { + this.options = { + enabled: options.enabled ?? false, + hud: options.hud ?? false, + outputFile: options.outputFile, + maxFrames: options.maxFrames, + nodeCount: options.nodeCount ?? false, + }; + } + + isEnabled(): boolean { + return this.options.enabled; + } + + getFrames(): readonly FrameMetrics[] { + return this.frames; + } + + getLastFrame(): FrameMetrics | null { + return this.lastFrame; + } + + beginFrame(size: { rows: number; cols: number }, extra?: { nodeCount?: number }) { + if (!this.options.enabled) return null; + if (this.options.maxFrames !== undefined && this.frames.length >= this.options.maxFrames) + return null; + + const id = ++this.frameSeq; + return { + id, + time: Date.now(), + rows: size.rows, + cols: size.cols, + nodeCount: extra?.nodeCount, + t0: performance.now(), + layoutMs: 0, + renderMs: 0, + diffMs: 0, + writeMs: 0, + }; + } + + endFrame( + frame: null | { + id: number; + time: number; + rows: number; + cols: number; + nodeCount?: number; + t0: number; + layoutMs: number; + renderMs: number; + diffMs: number; + writeMs: number; + outputBytes?: number; + diffStats?: { + changedCells: number; + ops: number; + cursorMoves: number; + fgChanges: number; + bgChanges: number; + resets: number; + fullRedraw: boolean; + }; + }, + ) { + if (!frame) return; + + const frameMs = performance.now() - frame.t0; + const metrics: FrameMetrics = { + id: frame.id, + time: frame.time, + rows: frame.rows, + cols: frame.cols, + nodeCount: frame.nodeCount, + outputBytes: frame.outputBytes, + diffCellsChanged: frame.diffStats?.changedCells, + diffOps: frame.diffStats?.ops, + diffCursorMoves: frame.diffStats?.cursorMoves, + diffStyleChanges: frame.diffStats + ? frame.diffStats.fgChanges + frame.diffStats.bgChanges + : undefined, + diffResets: frame.diffStats?.resets, + diffFullRedraw: frame.diffStats?.fullRedraw, + layoutMs: frame.layoutMs, + renderMs: frame.renderMs, + diffMs: frame.diffMs, + writeMs: frame.writeMs, + frameMs, + memory: tryMemoryUsage(), + }; + this.frames.push(metrics); + this.lastFrame = metrics; + } + + measure(frame: any, key: "layoutMs" | "renderMs" | "diffMs" | "writeMs", fn: () => T): T { + if (!frame) return fn(); + const t0 = performance.now(); + try { + return fn(); + } finally { + frame[key] += performance.now() - t0; + } + } + + recordOutput(frame: any, output: string) { + if (!frame) return; + frame.outputBytes = (frame.outputBytes ?? 0) + tryByteLength(output); + } + + recordDiffStats( + frame: any, + stats: { + changedCells: number; + ops: number; + cursorMoves: number; + fgChanges: number; + bgChanges: number; + resets: number; + fullRedraw: boolean; + }, + ) { + if (!frame) return; + frame.diffStats = stats; + } + + drawHud(buf: Buffer2D) { + if (!this.options.enabled || !this.options.hud) return; + const last = this.lastFrame; + if (!last) return; + + const lines = [ + `frame ${last.frameMs.toFixed(2)}ms (L${last.layoutMs.toFixed(2)} R${last.renderMs.toFixed(2)} D${last.diffMs.toFixed( + 2, + )} W${last.writeMs.toFixed(2)})`, + `nodes ${last.nodeCount ?? "-"} bytes ${last.outputBytes ?? 0} diff ${last.diffCellsChanged ?? 0} ops ${last.diffOps ?? 0}`, + last.memory + ? `heap ${Math.round(last.memory.heapUsed / 1024 / 1024)}MB rss ${Math.round(last.memory.rss / 1024 / 1024)}MB` + : "", + ].filter(Boolean); + + const width = Math.min(buf.cols, Math.max(...lines.map((l) => l.length)) + 2); + const height = Math.min(buf.rows, lines.length + 2); + const x0 = Math.max(0, buf.cols - width); + const y0 = 0; + + // simple box + const fg = "white"; + const bg = "black"; + for (let y = 0; y < height; y++) { + for (let x = 0; x < width; x++) { + buf.set(y0 + y, x0 + x, " ", { fg, bg }); + } + } + + const top = "─"; + const side = "│"; + const tl = "┌"; + const tr = "┐"; + const bl = "└"; + const br = "┘"; + buf.set(y0, x0, tl, { fg, bg }); + buf.set(y0, x0 + width - 1, tr, { fg, bg }); + buf.set(y0 + height - 1, x0, bl, { fg, bg }); + buf.set(y0 + height - 1, x0 + width - 1, br, { fg, bg }); + for (let x = 1; x < width - 1; x++) { + buf.set(y0, x0 + x, top, { fg, bg }); + buf.set(y0 + height - 1, x0 + x, top, { fg, bg }); + } + for (let y = 1; y < height - 1; y++) { + buf.set(y0 + y, x0, side, { fg, bg }); + buf.set(y0 + y, x0 + width - 1, side, { fg, bg }); + } + + // text + for (let i = 0; i < lines.length && i < height - 2; i++) { + const line = lines[i]!; + for (let j = 0; j < Math.min(line.length, width - 2); j++) { + buf.set(y0 + 1 + i, x0 + 1 + j, line[j]!, { fg, bg }); + } + } + } + + buildOutput(): ProfileOutput { + const frameTimes = this.frames.map((f) => f.frameMs).sort((a, b) => a - b); + const totals = this.frames.reduce( + (acc, f) => { + acc.layoutMs += f.layoutMs; + acc.renderMs += f.renderMs; + acc.diffMs += f.diffMs; + acc.writeMs += f.writeMs; + acc.frameMs += f.frameMs; + return acc; + }, + { layoutMs: 0, renderMs: 0, diffMs: 0, writeMs: 0, frameMs: 0 }, + ); + + return { + version: 1, + startedAt: this.startedAt.toISOString(), + endedAt: new Date().toISOString(), + frames: [...this.frames], + summary: { + frameCount: this.frames.length, + frameMs: { + p50: percentile(frameTimes, 0.5), + p95: percentile(frameTimes, 0.95), + p99: percentile(frameTimes, 0.99), + max: frameTimes.at(-1) ?? 0, + }, + totals, + }, + }; + } + + async flush(): Promise { + if (!this.options.enabled) return; + if (!this.options.outputFile) return; + + const output = JSON.stringify(this.buildOutput(), null, 2); + const dir = path.dirname(this.options.outputFile); + if (dir && dir !== ".") { + try { + fsSync.mkdirSync(dir, { recursive: true }); + } catch {} + } + // Bun.write exists in Bun; fall back to fs if needed. + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + if (typeof Bun !== "undefined" && typeof Bun.write === "function") { + await Bun.write(this.options.outputFile, output); + return; + } + + const fs = await import("node:fs/promises"); + await fs.writeFile(this.options.outputFile, output, "utf8"); + } + + flushSync(): void { + if (!this.options.enabled) return; + if (!this.options.outputFile) return; + const output = JSON.stringify(this.buildOutput(), null, 2); + const dir = path.dirname(this.options.outputFile); + if (dir && dir !== ".") { + try { + fsSync.mkdirSync(dir, { recursive: true }); + } catch {} + } + // Keep it synchronous so SIGINT flows can safely persist before exit. + fsSync.writeFileSync(this.options.outputFile, output, "utf8"); + } +} diff --git a/packages/btuin/src/runtime/render-loop.ts b/packages/btuin/src/runtime/render-loop.ts index e9ad154..77504df 100644 --- a/packages/btuin/src/runtime/render-loop.ts +++ b/packages/btuin/src/runtime/render-loop.ts @@ -4,10 +4,12 @@ * Handles the rendering loop, including buffer management and diff rendering. */ -import { getGlobalBufferPool, renderDiff, type Buffer2D } from "@btuin/renderer"; +import { getGlobalBufferPool, renderDiff, type Buffer2D, type DiffStats } from "@btuin/renderer"; import { layout, renderElement } from "../layout"; import type { ViewElement } from "../view/types/elements"; +import { isBlock } from "../view/types/elements"; import { createErrorContext } from "./error-boundary"; +import type { Profiler } from "./profiler"; /** * Terminal size configuration @@ -31,6 +33,8 @@ export interface RenderLoopConfig { getState: () => State; /** Error handler */ handleError: (context: import("./error-boundary").ErrorContext) => void; + /** Optional profiler */ + profiler?: Profiler; } /** @@ -82,21 +86,61 @@ export function createRenderer(config: RenderLoopConfig) { const rootElement = config.view(config.getState()); - const layoutResult = layout(rootElement, { - width: state.currentSize.cols, - height: state.currentSize.rows, - }); + const nodeCount = + config.profiler?.isEnabled() && config.profiler.options.nodeCount + ? countElements(rootElement) + : undefined; + const frame = config.profiler?.beginFrame(state.currentSize, { nodeCount }) ?? null; + + const layoutResult = + config.profiler?.measure(frame, "layoutMs", () => + layout(rootElement, { + width: state.currentSize.cols, + height: state.currentSize.rows, + }), + ) ?? + layout(rootElement, { + width: state.currentSize.cols, + height: state.currentSize.rows, + }); const buf = pool.acquire(); - renderElement(rootElement, buf, layoutResult, 0, 0); - const output = renderDiff(state.prevBuffer, buf); + config.profiler?.measure(frame, "renderMs", () => { + renderElement(rootElement, buf, layoutResult, 0, 0); + }); + + config.profiler?.drawHud(buf); + + const diffStats: DiffStats | undefined = frame + ? { + sizeChanged: false, + fullRedraw: false, + changedCells: 0, + cursorMoves: 0, + fgChanges: 0, + bgChanges: 0, + resets: 0, + ops: 0, + } + : undefined; + + const output = + config.profiler?.measure(frame, "diffMs", () => + renderDiff(state.prevBuffer, buf, diffStats), + ) ?? renderDiff(state.prevBuffer, buf); + if (frame && diffStats) { + config.profiler?.recordDiffStats(frame, diffStats); + } if (output) { - config.write(output); + config.profiler?.recordOutput(frame, output); + config.profiler?.measure(frame, "writeMs", () => config.write(output)); } // Return old prev buffer to the pool and keep the new one pool.release(state.prevBuffer); state.prevBuffer = buf; + + config.profiler?.endFrame(frame); } catch (error) { config.handleError(createErrorContext("render", error)); } @@ -114,3 +158,11 @@ export function createRenderer(config: RenderLoopConfig) { getState, }; } + +function countElements(root: ViewElement): number { + let count = 1; + if (isBlock(root)) { + for (const child of root.children) count += countElements(child); + } + return count; +} diff --git a/packages/btuin/src/runtime/terminal-adapter.ts b/packages/btuin/src/runtime/terminal-adapter.ts index 6926792..6d53584 100644 --- a/packages/btuin/src/runtime/terminal-adapter.ts +++ b/packages/btuin/src/runtime/terminal-adapter.ts @@ -26,4 +26,3 @@ export function createDefaultTerminalAdapter(): TerminalAdapter { write: terminal.write, }; } - diff --git a/packages/btuin/src/view/primitives/spacer.ts b/packages/btuin/src/view/primitives/spacer.ts index 2cecd82..9e3edd0 100644 --- a/packages/btuin/src/view/primitives/spacer.ts +++ b/packages/btuin/src/view/primitives/spacer.ts @@ -11,4 +11,3 @@ export function Spacer(grow = 1): BlockElement { el.style.flexBasis = 0; return el; } - diff --git a/packages/btuin/tests/layout/zstack.test.ts b/packages/btuin/tests/layout/zstack.test.ts index 22d953f..b45a42f 100644 --- a/packages/btuin/tests/layout/zstack.test.ts +++ b/packages/btuin/tests/layout/zstack.test.ts @@ -20,7 +20,11 @@ describe("ZStack", () => { }); test("should overlay children at the same origin", () => { - const root = ZStack([Text("Hello"), Text("X")]).setKey("root").width(5).height(1).build(); + const root = ZStack([Text("Hello"), Text("X")]) + .setKey("root") + .width(5) + .height(1) + .build(); const layoutMap = layout(root, { width: 5, height: 1 }); const buffer = createBuffer(1, 5); diff --git a/packages/btuin/tests/view/primitives/spacer.test.ts b/packages/btuin/tests/view/primitives/spacer.test.ts index cfe00c8..df492d7 100644 --- a/packages/btuin/tests/view/primitives/spacer.test.ts +++ b/packages/btuin/tests/view/primitives/spacer.test.ts @@ -11,4 +11,3 @@ describe("Spacer Primitive", () => { expect(el.style.flexBasis).toBe(0); }); }); - diff --git a/packages/renderer/src/diff.ts b/packages/renderer/src/diff.ts index 4c336ce..b2a4986 100644 --- a/packages/renderer/src/diff.ts +++ b/packages/renderer/src/diff.ts @@ -1,5 +1,16 @@ import type { Buffer2D } from "./types"; +export interface DiffStats { + sizeChanged: boolean; + fullRedraw: boolean; + changedCells: number; + cursorMoves: number; + fgChanges: number; + bgChanges: number; + resets: number; + ops: number; +} + /** * Renders the difference between two buffers, only updating changed cells. * If buffer sizes differ (e.g., after terminal resize), forces a full redraw. @@ -13,14 +24,27 @@ import type { Buffer2D } from "./types"; * * @param prev - Previous buffer state * @param next - New buffer state to render + * @param stats - Optional stats collector */ -export function renderDiff(prev: Buffer2D, next: Buffer2D): string { +export function renderDiff(prev: Buffer2D, next: Buffer2D, stats?: DiffStats): string { const rows = next.rows; const cols = next.cols; if (rows === 0 || cols === 0) return ""; // Check if buffer sizes match const sizeChanged = prev.rows !== rows || prev.cols !== cols; + const fullRedraw = sizeChanged; + + if (stats) { + stats.sizeChanged = sizeChanged; + stats.fullRedraw = fullRedraw; + stats.changedCells = 0; + stats.cursorMoves = 0; + stats.fgChanges = 0; + stats.bgChanges = 0; + stats.resets = 0; + stats.ops = 0; + } let currentFg: string | undefined; let currentBg: string | undefined; @@ -47,6 +71,10 @@ export function renderDiff(prev: Buffer2D, next: Buffer2D): string { // Force redraw all cells if size changed, otherwise check for differences if (sizeChanged || nextCode !== prevCode || nextFg !== prevFg || nextBg !== prevBg) { + if (stats) { + stats.changedCells++; + stats.cursorMoves++; + } // Move cursor: \x1b[row;colH out.push(`\x1b[${r + 1};${c + 1}H`); @@ -58,6 +86,7 @@ export function renderDiff(prev: Buffer2D, next: Buffer2D): string { } currentFg = nextFg; styleDirty = true; + if (stats) stats.fgChanges++; } if (nextBg !== currentBg) { if (nextBg === undefined) { @@ -67,6 +96,7 @@ export function renderDiff(prev: Buffer2D, next: Buffer2D): string { } currentBg = nextBg; styleDirty = true; + if (stats) stats.bgChanges++; } out.push(String.fromCodePoint(nextCode)); @@ -76,6 +106,11 @@ export function renderDiff(prev: Buffer2D, next: Buffer2D): string { if (styleDirty) { out.push("\x1b[0m"); + if (stats) stats.resets++; + } + + if (stats) { + stats.ops = stats.cursorMoves + stats.fgChanges + stats.bgChanges + stats.resets; } return out.length > 0 ? out.join("") : ""; diff --git a/packages/renderer/tests/diff.test.ts b/packages/renderer/tests/diff.test.ts index 2efe29b..6bf9096 100644 --- a/packages/renderer/tests/diff.test.ts +++ b/packages/renderer/tests/diff.test.ts @@ -2,6 +2,7 @@ import { describe, it, expect, mock, beforeEach } from "bun:test"; import { renderDiff } from "../src/diff"; import { FlatBuffer } from "../src/buffer"; import type { Buffer2D } from "../src/types"; +import type { DiffStats } from "../src/diff"; // Helper to create a mock buffer function createMockBuffer( @@ -22,8 +23,7 @@ function createMockBuffer( } describe("renderDiff", () => { - beforeEach(() => { - }); + beforeEach(() => {}); it("should not write anything if buffers are identical", () => { const prev = createMockBuffer(2, 2, "a"); @@ -97,4 +97,35 @@ describe("renderDiff", () => { expect(output).toBe(expected); }); + + it("should report diff stats", () => { + const prev = createMockBuffer(2, 2, " "); + const next = createMockBuffer(2, 2, " "); + + next.cells[0] = "A".codePointAt(0)!; + next.fg[0] = "\x1b[31m"; + next.cells[1] = "B".codePointAt(0)!; + next.fg[1] = "\x1b[31m"; + next.cells[2] = "C".codePointAt(0)!; + next.fg[2] = "\x1b[32m"; + + const stats: DiffStats = { + sizeChanged: false, + fullRedraw: false, + changedCells: 0, + cursorMoves: 0, + fgChanges: 0, + bgChanges: 0, + resets: 0, + ops: 0, + }; + + const output = renderDiff(prev, next, stats); + + expect(output.length).toBeGreaterThan(0); + expect(stats.changedCells).toBe(3); + expect(stats.cursorMoves).toBe(3); + expect(stats.fgChanges).toBe(2); + expect(stats.ops).toBe(stats.cursorMoves + stats.fgChanges + stats.bgChanges + stats.resets); + }); }); diff --git a/packages/showcase/dashboard.ts b/packages/showcase/dashboard.ts index 280ac19..03f219b 100644 --- a/packages/showcase/dashboard.ts +++ b/packages/showcase/dashboard.ts @@ -40,7 +40,9 @@ function titleBar(title: string, right?: string) { } function card(lines: string[], accent: string) { - return VStack(lines.map((l) => Text(l))).gap(0).outline({ style: "single", color: accent }); + return VStack(lines.map((l) => Text(l))) + .gap(0) + .outline({ style: "single", color: accent }); } const app = createApp({ @@ -221,7 +223,9 @@ const app = createApp({ titleBar("Overlay", "z to close"), Text("Floating window via ZStack").foreground("gray"), Text("This clears its own area (bg).").foreground("gray"), - ...(modalHeight >= 9 ? [Block().height(1), Text("Resize and toggle.").foreground("gray")] : []), + ...(modalHeight >= 9 + ? [Block().height(1), Text("Resize and toggle.").foreground("gray")] + : []), ]) .width(modalWidth) .height(modalHeight) @@ -234,20 +238,13 @@ const app = createApp({ }; const baseApp = () => - VStack([ - header(), - HStack([sidebar(), main()]).gap(1).align("stretch").grow(1), - footer(), - ]) + VStack([header(), HStack([sidebar(), main()]).gap(1).align("stretch").grow(1), footer()]) .width("100%") .justify("flex-start") .align("stretch"); return () => - ZStack([ - baseApp(), - ...(showOverlay.value ? [floatingOverlay()] : []), - ]) + ZStack([baseApp(), ...(showOverlay.value ? [floatingOverlay()] : [])]) .width("100%") .height("100%"); }, diff --git a/packages/terminal/tests/raw.test.ts b/packages/terminal/tests/raw.test.ts index 1b62502..b9d5193 100644 --- a/packages/terminal/tests/raw.test.ts +++ b/packages/terminal/tests/raw.test.ts @@ -1,11 +1,5 @@ import { describe, it, expect, mock, beforeEach, afterEach } from "bun:test"; -import { - setupRawMode, - onKey, - cleanup, - cleanupWithoutClear, - resetKeyHandlers, -} from "../src/raw"; +import { setupRawMode, onKey, cleanup, cleanupWithoutClear, resetKeyHandlers } from "../src/raw"; import type { KeyHandler, KeyEvent } from "../src/types"; // Mock the 'io' module diff --git a/profiles/layout-1765733911613.json b/profiles/layout-1765733911613.json new file mode 100644 index 0000000..e2ceb68 --- /dev/null +++ b/profiles/layout-1765733911613.json @@ -0,0 +1,3022 @@ +{ + "version": 1, + "startedAt": "2025-12-14T17:38:31.613Z", + "endedAt": "2025-12-14T17:38:37.237Z", + "frames": [ + { + "id": 1, + "time": 1765733911622, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1428, + "diffCellsChanged": 181, + "diffOps": 184, + "diffCursorMoves": 181, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 50.84525000000001, + "renderMs": 2.913250000000005, + "diffMs": 0.4022500000000093, + "writeMs": 0.00895900000000438, + "frameMs": 54.4745, + "memory": { + "rss": 169099264, + "heapTotal": 16390144, + "heapUsed": 38110773, + "external": 49647198 + } + }, + { + "id": 2, + "time": 1765733911679, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2199, + "diffCellsChanged": 277, + "diffOps": 280, + "diffCursorMoves": 277, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 45.371166, + "renderMs": 7.460667000000001, + "diffMs": 0.1640000000000157, + "writeMs": 0.0016250000000184173, + "frameMs": 53.027584000000004, + "memory": { + "rss": 229064704, + "heapTotal": 33859584, + "heapUsed": 60780847, + "external": 49825423 + } + }, + { + "id": 3, + "time": 1765733911734, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1426, + "diffCellsChanged": 178, + "diffOps": 181, + "diffCursorMoves": 178, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 44.372083, + "renderMs": 0.7922090000000139, + "diffMs": 0.10650000000001114, + "writeMs": 0.0015840000000082455, + "frameMs": 45.290291999999994, + "memory": { + "rss": 233390080, + "heapTotal": 34465792, + "heapUsed": 62974778, + "external": 50125610 + } + }, + { + "id": 4, + "time": 1765733911780, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1427, + "diffCellsChanged": 179, + "diffOps": 182, + "diffCursorMoves": 179, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 41.371791, + "renderMs": 5.653292000000022, + "diffMs": 0.12954099999998903, + "writeMs": 0.0005419999999958236, + "frameMs": 47.18195800000001, + "memory": { + "rss": 258932736, + "heapTotal": 48048128, + "heapUsed": 62974778, + "external": 50125610 + } + }, + { + "id": 5, + "time": 1765733911828, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2020, + "diffCellsChanged": 254, + "diffOps": 257, + "diffCursorMoves": 254, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 44.128083000000004, + "renderMs": 0.8041249999999991, + "diffMs": 0.11908400000004349, + "writeMs": 0.0004999999999881766, + "frameMs": 45.06766700000003, + "memory": { + "rss": 259604480, + "heapTotal": 48048128, + "heapUsed": 65071990, + "external": 50371782 + } + }, + { + "id": 6, + "time": 1765733911874, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2151, + "diffCellsChanged": 270, + "diffOps": 273, + "diffCursorMoves": 270, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 40.94958299999996, + "renderMs": 4.998874999999998, + "diffMs": 0.11045799999999417, + "writeMs": 0.0004160000000297259, + "frameMs": 46.076707999999996, + "memory": { + "rss": 263012352, + "heapTotal": 49915904, + "heapUsed": 65071990, + "external": 50371782 + } + }, + { + "id": 7, + "time": 1765733911922, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1480, + "diffCellsChanged": 185, + "diffOps": 188, + "diffCursorMoves": 185, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 44.164083000000005, + "renderMs": 0.6298329999999623, + "diffMs": 0.1309999999999718, + "writeMs": 0.0004999999999881766, + "frameMs": 44.943250000000035, + "memory": { + "rss": 263487488, + "heapTotal": 49915904, + "heapUsed": 67152908, + "external": 50602540 + } + }, + { + "id": 8, + "time": 1765733911967, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1419, + "diffCellsChanged": 178, + "diffOps": 181, + "diffCursorMoves": 178, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 40.07062500000001, + "renderMs": 4.726832999999999, + "diffMs": 0.18537500000002183, + "writeMs": 0.00037500000001955414, + "frameMs": 44.99908300000004, + "memory": { + "rss": 264847360, + "heapTotal": 51226624, + "heapUsed": 67152908, + "external": 50602540 + } + }, + { + "id": 9, + "time": 1765733912014, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1981, + "diffCellsChanged": 248, + "diffOps": 251, + "diffCursorMoves": 248, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 43.41087500000003, + "renderMs": 0.6931670000000167, + "diffMs": 0.12958400000002257, + "writeMs": 0.0013749999999959073, + "frameMs": 44.287082999999996, + "memory": { + "rss": 264863744, + "heapTotal": 51226624, + "heapUsed": 69251842, + "external": 50842258 + } + }, + { + "id": 10, + "time": 1765733912058, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2146, + "diffCellsChanged": 269, + "diffOps": 272, + "diffCursorMoves": 269, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 40.17462499999999, + "renderMs": 4.8250000000000455, + "diffMs": 0.16945799999996325, + "writeMs": 0.00037500000001955414, + "frameMs": 45.19304199999999, + "memory": { + "rss": 268517376, + "heapTotal": 54388736, + "heapUsed": 69251842, + "external": 50842258 + } + }, + { + "id": 11, + "time": 1765733912105, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1433, + "diffCellsChanged": 179, + "diffOps": 182, + "diffCursorMoves": 179, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 47.628333, + "renderMs": 0.6399579999999787, + "diffMs": 0.13999999999998636, + "writeMs": 0.00041699999997035775, + "frameMs": 48.423583000000065, + "memory": { + "rss": 268517376, + "heapTotal": 54388736, + "heapUsed": 71305115, + "external": 51046347 + } + }, + { + "id": 12, + "time": 1765733912154, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1422, + "diffCellsChanged": 178, + "diffOps": 181, + "diffCursorMoves": 178, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 40.968166, + "renderMs": 4.736666000000014, + "diffMs": 0.1306250000000091, + "writeMs": 0.00024999999993724487, + "frameMs": 45.85141699999997, + "memory": { + "rss": 270483456, + "heapTotal": 56092672, + "heapUsed": 71305115, + "external": 51046347 + } + }, + { + "id": 13, + "time": 1765733912201, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2113, + "diffCellsChanged": 266, + "diffOps": 269, + "diffCursorMoves": 266, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 45.583582999999976, + "renderMs": 0.7534160000000156, + "diffMs": 0.14333299999998417, + "writeMs": 0.00029200000005857873, + "frameMs": 46.495000000000005, + "memory": { + "rss": 270499840, + "heapTotal": 56092672, + "heapUsed": 73356476, + "external": 51249004 + } + }, + { + "id": 14, + "time": 1765733912248, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2215, + "diffCellsChanged": 279, + "diffOps": 282, + "diffCursorMoves": 279, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 40.67420900000002, + "renderMs": 5.06254100000001, + "diffMs": 0.14404100000001563, + "writeMs": 0.0002919999999448919, + "frameMs": 45.90204199999994, + "memory": { + "rss": 272793600, + "heapTotal": 57976832, + "heapUsed": 73356476, + "external": 51249004 + } + }, + { + "id": 15, + "time": 1765733912296, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1434, + "diffCellsChanged": 179, + "diffOps": 182, + "diffCursorMoves": 179, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 43.886708, + "renderMs": 0.6787500000000364, + "diffMs": 0.11275000000000546, + "writeMs": 0.0003330000000687505, + "frameMs": 44.707374999999956, + "memory": { + "rss": 273104896, + "heapTotal": 57976832, + "heapUsed": 75410293, + "external": 51453861 + } + }, + { + "id": 16, + "time": 1765733912341, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1435, + "diffCellsChanged": 180, + "diffOps": 183, + "diffCursorMoves": 180, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 38.92845799999998, + "renderMs": 4.894333999999958, + "diffMs": 0.14387500000009368, + "writeMs": 0.00045799999998052954, + "frameMs": 43.985124999999925, + "memory": { + "rss": 274857984, + "heapTotal": 59664384, + "heapUsed": 75410293, + "external": 51453861 + } + }, + { + "id": 17, + "time": 1765733912386, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2028, + "diffCellsChanged": 255, + "diffOps": 258, + "diffCursorMoves": 255, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 43.2879999999999, + "renderMs": 0.7509999999999764, + "diffMs": 0.1306250000000091, + "writeMs": 0.0005409999999983484, + "frameMs": 44.19854200000009, + "memory": { + "rss": 274857984, + "heapTotal": 59664384, + "heapUsed": 77461054, + "external": 51656142 + } + }, + { + "id": 18, + "time": 1765733912431, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2167, + "diffCellsChanged": 272, + "diffOps": 275, + "diffCursorMoves": 272, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 39.05087500000002, + "renderMs": 5.158500000000004, + "diffMs": 0.1482499999999618, + "writeMs": 0.00037500000007639755, + "frameMs": 44.396499999999946, + "memory": { + "rss": 277200896, + "heapTotal": 61663232, + "heapUsed": 77461054, + "external": 51656142 + } + }, + { + "id": 19, + "time": 1765733912477, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1496, + "diffCellsChanged": 187, + "diffOps": 190, + "diffCursorMoves": 187, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 43.72779200000002, + "renderMs": 0.6473750000000109, + "diffMs": 0.13283300000000509, + "writeMs": 0.0004589999999780048, + "frameMs": 44.522042000000056, + "memory": { + "rss": 277692416, + "heapTotal": 61663232, + "heapUsed": 79512399, + "external": 51858511 + } + }, + { + "id": 20, + "time": 1765733912522, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1427, + "diffCellsChanged": 179, + "diffOps": 182, + "diffCursorMoves": 179, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 40.662207999999964, + "renderMs": 5.023500000000013, + "diffMs": 0.14504199999998946, + "writeMs": 0.00024999999993724487, + "frameMs": 45.84512499999994, + "memory": { + "rss": 279412736, + "heapTotal": 63449088, + "heapUsed": 79512399, + "external": 51858511 + } + }, + { + "id": 21, + "time": 1765733912569, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1989, + "diffCellsChanged": 249, + "diffOps": 252, + "diffCursorMoves": 249, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 43.28724999999997, + "renderMs": 0.7118340000000671, + "diffMs": 0.12808399999994435, + "writeMs": 0.00033400000006622577, + "frameMs": 44.141917000000035, + "memory": { + "rss": 279429120, + "heapTotal": 63449088, + "heapUsed": 81563608, + "external": 52060792 + } + }, + { + "id": 22, + "time": 1765733912615, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2162, + "diffCellsChanged": 271, + "diffOps": 274, + "diffCursorMoves": 271, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 39.4921250000001, + "renderMs": 4.923500000000104, + "diffMs": 0.1306250000000091, + "writeMs": 0.00041699999997035775, + "frameMs": 44.564500000000066, + "memory": { + "rss": 279658496, + "heapTotal": 63449088, + "heapUsed": 83614993, + "external": 52263073 + } + }, + { + "id": 23, + "time": 1765733912660, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1441, + "diffCellsChanged": 180, + "diffOps": 183, + "diffCursorMoves": 180, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 43.36999999999989, + "renderMs": 0.6962909999999738, + "diffMs": 0.1207080000001497, + "writeMs": 0.00037500000007639755, + "frameMs": 44.200582999999824, + "memory": { + "rss": 279855104, + "heapTotal": 63449088, + "heapUsed": 85667756, + "external": 52467516 + } + }, + { + "id": 24, + "time": 1765733912705, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1422, + "diffCellsChanged": 178, + "diffOps": 181, + "diffCursorMoves": 178, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 43.8832910000001, + "renderMs": 5.5001250000000255, + "diffMs": 0.13020800000003874, + "writeMs": 0.00041699999997035775, + "frameMs": 49.53183400000012, + "memory": { + "rss": 286015488, + "heapTotal": 69052416, + "heapUsed": 85667756, + "external": 52467516 + } + }, + { + "id": 25, + "time": 1765733912756, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2113, + "diffCellsChanged": 266, + "diffOps": 269, + "diffCursorMoves": 266, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 44.12937500000021, + "renderMs": 0.8034999999999854, + "diffMs": 0.1300420000000031, + "writeMs": 0.0002919999999448919, + "frameMs": 45.0787499999999, + "memory": { + "rss": 286015488, + "heapTotal": 69052416, + "heapUsed": 87718517, + "external": 52669797 + } + }, + { + "id": 26, + "time": 1765733912802, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2215, + "diffCellsChanged": 279, + "diffOps": 282, + "diffCursorMoves": 279, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 40.54495799999995, + "renderMs": 4.776624999999967, + "diffMs": 0.13412500000004002, + "writeMs": 0.00037500000007639755, + "frameMs": 45.470666000000165, + "memory": { + "rss": 288194560, + "heapTotal": 70871040, + "heapUsed": 87718517, + "external": 52669797 + } + }, + { + "id": 27, + "time": 1765733912849, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1434, + "diffCellsChanged": 179, + "diffOps": 182, + "diffCursorMoves": 179, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 43.522290999999996, + "renderMs": 0.8103750000000218, + "diffMs": 0.12154199999986304, + "writeMs": 0.00045899999986431794, + "frameMs": 44.468832999999904, + "memory": { + "rss": 288210944, + "heapTotal": 70871040, + "heapUsed": 89770246, + "external": 52872566 + } + }, + { + "id": 28, + "time": 1765733912894, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1435, + "diffCellsChanged": 180, + "diffOps": 183, + "diffCursorMoves": 180, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 39.74262500000009, + "renderMs": 5.026082999999971, + "diffMs": 0.13029200000005403, + "writeMs": 0.00045799999998052954, + "frameMs": 44.91212500000006, + "memory": { + "rss": 290226176, + "heapTotal": 72558592, + "heapUsed": 89770246, + "external": 52872566 + } + }, + { + "id": 29, + "time": 1765733912941, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2028, + "diffCellsChanged": 255, + "diffOps": 258, + "diffCursorMoves": 255, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 44.77970800000003, + "renderMs": 0.5829169999999522, + "diffMs": 0.13145800000006602, + "writeMs": 0.0002919999999448919, + "frameMs": 45.510125000000016, + "memory": { + "rss": 290750464, + "heapTotal": 72557568, + "heapUsed": 91823807, + "external": 49948250 + } + }, + { + "id": 30, + "time": 1765733912987, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2167, + "diffCellsChanged": 272, + "diffOps": 275, + "diffCursorMoves": 272, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 39.924666000000116, + "renderMs": 4.774208000000044, + "diffMs": 0.13970900000003894, + "writeMs": 0.0002910000000611035, + "frameMs": 44.851874999999836, + "memory": { + "rss": 291405824, + "heapTotal": 72557568, + "heapUsed": 91823807, + "external": 49948250 + } + }, + { + "id": 31, + "time": 1765733913033, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1496, + "diffCellsChanged": 187, + "diffOps": 190, + "diffCursorMoves": 187, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 42.015499999999975, + "renderMs": 0.5000420000001213, + "diffMs": 0.12983299999996234, + "writeMs": 0.00045899999986431794, + "frameMs": 42.659042, + "memory": { + "rss": 291454976, + "heapTotal": 72557568, + "heapUsed": 56924036, + "external": 50152356 + } + }, + { + "id": 32, + "time": 1765733913077, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1427, + "diffCellsChanged": 179, + "diffOps": 182, + "diffCursorMoves": 179, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 38.53337499999998, + "renderMs": 4.741292000000158, + "diffMs": 0.1270830000000842, + "writeMs": 0.0003749999998490239, + "frameMs": 43.41783299999997, + "memory": { + "rss": 291454976, + "heapTotal": 72557568, + "heapUsed": 58975044, + "external": 50355092 + } + }, + { + "id": 33, + "time": 1765733913121, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1989, + "diffCellsChanged": 249, + "diffOps": 252, + "diffCursorMoves": 249, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 42.3019589999999, + "renderMs": 0.6761659999999665, + "diffMs": 0.12770799999998417, + "writeMs": 0.00024999999982355803, + "frameMs": 43.127709000000095, + "memory": { + "rss": 291454976, + "heapTotal": 72557568, + "heapUsed": 61026254, + "external": 50557598 + } + }, + { + "id": 34, + "time": 1765733913165, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2162, + "diffCellsChanged": 271, + "diffOps": 274, + "diffCursorMoves": 271, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 39.36566599999992, + "renderMs": 4.698499999999967, + "diffMs": 0.1489169999999831, + "writeMs": 0.001040999999986525, + "frameMs": 44.2338749999999, + "memory": { + "rss": 291520512, + "heapTotal": 72557568, + "heapUsed": 61026254, + "external": 50557598 + } + }, + { + "id": 35, + "time": 1765733913211, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1441, + "diffCellsChanged": 180, + "diffOps": 183, + "diffCursorMoves": 180, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 42.84004200000004, + "renderMs": 0.6319999999998345, + "diffMs": 0.12245800000005147, + "writeMs": 0.0005419999999958236, + "frameMs": 43.63912500000015, + "memory": { + "rss": 291520512, + "heapTotal": 72557568, + "heapUsed": 63077271, + "external": 50759879 + } + }, + { + "id": 36, + "time": 1765733913255, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1422, + "diffCellsChanged": 178, + "diffOps": 181, + "diffCursorMoves": 178, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 39.16516699999988, + "renderMs": 4.674333000000161, + "diffMs": 0.12866600000006656, + "writeMs": 0.0004999999998744897, + "frameMs": 44.01616700000022, + "memory": { + "rss": 291520512, + "heapTotal": 72557568, + "heapUsed": 63077271, + "external": 50759879 + } + }, + { + "id": 37, + "time": 1765733913301, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2113, + "diffCellsChanged": 266, + "diffOps": 269, + "diffCursorMoves": 266, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 43.57937500000003, + "renderMs": 0.7215409999998883, + "diffMs": 0.14516699999990124, + "writeMs": 0.0017920000000231084, + "frameMs": 44.472667, + "memory": { + "rss": 291553280, + "heapTotal": 72557568, + "heapUsed": 65132702, + "external": 50964622 + } + }, + { + "id": 38, + "time": 1765733913346, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2215, + "diffCellsChanged": 279, + "diffOps": 282, + "diffCursorMoves": 279, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 40.18595899999991, + "renderMs": 4.8205420000001595, + "diffMs": 0.13116700000000492, + "writeMs": 0.00041699999997035775, + "frameMs": 45.155042000000094, + "memory": { + "rss": 291553280, + "heapTotal": 72557568, + "heapUsed": 65132702, + "external": 50964622 + } + }, + { + "id": 39, + "time": 1765733913392, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1434, + "diffCellsChanged": 179, + "diffOps": 182, + "diffCursorMoves": 179, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 43.55758300000002, + "renderMs": 0.627292000000125, + "diffMs": 0.1143329999999878, + "writeMs": 0.00041699999997035775, + "frameMs": 44.313041999999996, + "memory": { + "rss": 291569664, + "heapTotal": 72557568, + "heapUsed": 67183815, + "external": 51166903 + } + }, + { + "id": 40, + "time": 1765733913437, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1435, + "diffCellsChanged": 180, + "diffOps": 183, + "diffCursorMoves": 180, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 40.39562500000011, + "renderMs": 5.001208000000133, + "diffMs": 0.1388329999999769, + "writeMs": 0.00045799999998052954, + "frameMs": 45.54887499999995, + "memory": { + "rss": 291569664, + "heapTotal": 72557568, + "heapUsed": 67183815, + "external": 51166903 + } + }, + { + "id": 41, + "time": 1765733913484, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2028, + "diffCellsChanged": 255, + "diffOps": 258, + "diffCursorMoves": 255, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 44.84883300000001, + "renderMs": 0.787958000000117, + "diffMs": 0.16762500000004366, + "writeMs": 0.0005830000000059954, + "frameMs": 45.81966599999987, + "memory": { + "rss": 291569664, + "heapTotal": 72557568, + "heapUsed": 69234576, + "external": 51369184 + } + }, + { + "id": 42, + "time": 1765733913530, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2167, + "diffCellsChanged": 272, + "diffOps": 275, + "diffCursorMoves": 272, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 46.96941599999991, + "renderMs": 5.62541699999997, + "diffMs": 0.15495799999985138, + "writeMs": 0.0003339999998388521, + "frameMs": 52.765957999999955, + "memory": { + "rss": 291569664, + "heapTotal": 72557568, + "heapUsed": 69234576, + "external": 51369184 + } + }, + { + "id": 43, + "time": 1765733913585, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1496, + "diffCellsChanged": 187, + "diffOps": 190, + "diffCursorMoves": 187, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 48.81766700000003, + "renderMs": 0.48862499999995634, + "diffMs": 0.12920800000006238, + "writeMs": 0.0005419999999958236, + "frameMs": 49.452166000000034, + "memory": { + "rss": 291569664, + "heapTotal": 72557568, + "heapUsed": 71285593, + "external": 50054800 + } + }, + { + "id": 44, + "time": 1765733913636, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1427, + "diffCellsChanged": 179, + "diffOps": 182, + "diffCursorMoves": 179, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 46.48500000000013, + "renderMs": 5.0229999999996835, + "diffMs": 0.1319579999999405, + "writeMs": 0.0006250000001273293, + "frameMs": 51.65979200000015, + "memory": { + "rss": 291569664, + "heapTotal": 72557568, + "heapUsed": 57037974, + "external": 50260646 + } + }, + { + "id": 45, + "time": 1765733913689, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1989, + "diffCellsChanged": 249, + "diffOps": 252, + "diffCursorMoves": 249, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 44.99225000000024, + "renderMs": 0.7014999999996689, + "diffMs": 0.12670900000011898, + "writeMs": 0.0006669999997939158, + "frameMs": 45.83787500000017, + "memory": { + "rss": 291569664, + "heapTotal": 72557568, + "heapUsed": 59090387, + "external": 50465427 + } + }, + { + "id": 46, + "time": 1765733913735, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2162, + "diffCellsChanged": 271, + "diffOps": 274, + "diffCursorMoves": 271, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 40.39191699999992, + "renderMs": 5.05087500000036, + "diffMs": 0.12704200000007404, + "writeMs": 0.00045799999998052954, + "frameMs": 45.582000000000335, + "memory": { + "rss": 291569664, + "heapTotal": 72557568, + "heapUsed": 59090387, + "external": 50465427 + } + }, + { + "id": 47, + "time": 1765733913782, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1441, + "diffCellsChanged": 180, + "diffOps": 183, + "diffCursorMoves": 180, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 43.493375000000015, + "renderMs": 0.6422919999999976, + "diffMs": 0.12258299999984956, + "writeMs": 0.0005839999998897838, + "frameMs": 44.27691700000014, + "memory": { + "rss": 291569664, + "heapTotal": 72557568, + "heapUsed": 61142707, + "external": 50669011 + } + }, + { + "id": 48, + "time": 1765733913827, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1422, + "diffCellsChanged": 178, + "diffOps": 181, + "diffCursorMoves": 178, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 40.46174999999994, + "renderMs": 4.883416000000125, + "diffMs": 0.129790999999841, + "writeMs": 0.0003749999996216502, + "frameMs": 45.52795799999967, + "memory": { + "rss": 291586048, + "heapTotal": 72557568, + "heapUsed": 61142707, + "external": 50669011 + } + }, + { + "id": 49, + "time": 1765733913874, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2113, + "diffCellsChanged": 266, + "diffOps": 269, + "diffCursorMoves": 266, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 45.36758299999974, + "renderMs": 0.6549589999999625, + "diffMs": 0.14724999999998545, + "writeMs": 0.0005000000001018634, + "frameMs": 46.183708000000024, + "memory": { + "rss": 291586048, + "heapTotal": 72557568, + "heapUsed": 63197012, + "external": 50874388 + } + }, + { + "id": 50, + "time": 1765733913921, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2215, + "diffCellsChanged": 279, + "diffOps": 282, + "diffCursorMoves": 279, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 40.462249999999585, + "renderMs": 4.773083000000042, + "diffMs": 0.14091700000017227, + "writeMs": 0.0004169999997429841, + "frameMs": 45.40391700000009, + "memory": { + "rss": 291586048, + "heapTotal": 72557568, + "heapUsed": 63197012, + "external": 50874388 + } + }, + { + "id": 51, + "time": 1765733913968, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1434, + "diffCellsChanged": 179, + "diffOps": 182, + "diffCursorMoves": 179, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 43.87416600000006, + "renderMs": 0.6018330000001697, + "diffMs": 0.13204099999984464, + "writeMs": 0.00037500000007639755, + "frameMs": 44.638916999999765, + "memory": { + "rss": 291586048, + "heapTotal": 72557568, + "heapUsed": 65249493, + "external": 51077461 + } + }, + { + "id": 52, + "time": 1765733914013, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1435, + "diffCellsChanged": 180, + "diffOps": 183, + "diffCursorMoves": 180, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 40.11824999999999, + "renderMs": 4.903249999999844, + "diffMs": 0.141208000000006, + "writeMs": 0.0005000000001018634, + "frameMs": 45.17599999999993, + "memory": { + "rss": 291586048, + "heapTotal": 72557568, + "heapUsed": 65249493, + "external": 51077461 + } + }, + { + "id": 53, + "time": 1765733914059, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2028, + "diffCellsChanged": 255, + "diffOps": 258, + "diffCursorMoves": 255, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 47.35750000000007, + "renderMs": 0.7036670000002232, + "diffMs": 0.13045899999997346, + "writeMs": 0.0005830000000059954, + "frameMs": 48.20512499999995, + "memory": { + "rss": 291864576, + "heapTotal": 72557568, + "heapUsed": 67303342, + "external": 51281934 + } + }, + { + "id": 54, + "time": 1765733914108, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2167, + "diffCellsChanged": 272, + "diffOps": 275, + "diffCursorMoves": 272, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 40.74866599999996, + "renderMs": 4.90762500000028, + "diffMs": 0.1386250000000473, + "writeMs": 0.0004169999997429841, + "frameMs": 45.806583000000046, + "memory": { + "rss": 291962880, + "heapTotal": 72557568, + "heapUsed": 67303342, + "external": 51281934 + } + }, + { + "id": 55, + "time": 1765733914156, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1496, + "diffCellsChanged": 187, + "diffOps": 190, + "diffCursorMoves": 187, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 43.80074999999988, + "renderMs": 0.6321669999997539, + "diffMs": 0.13149999999995998, + "writeMs": 0.0004169999997429841, + "frameMs": 44.57837500000005, + "memory": { + "rss": 292012032, + "heapTotal": 72557568, + "heapUsed": 69356263, + "external": 51485015 + } + }, + { + "id": 56, + "time": 1765733914201, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1427, + "diffCellsChanged": 179, + "diffOps": 182, + "diffCursorMoves": 179, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 39.77779200000032, + "renderMs": 5.073624999999993, + "diffMs": 0.1220829999997477, + "writeMs": 0.00045899999986431794, + "frameMs": 44.98741700000028, + "memory": { + "rss": 292012032, + "heapTotal": 72557568, + "heapUsed": 69356263, + "external": 51485015 + } + }, + { + "id": 57, + "time": 1765733914247, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1989, + "diffCellsChanged": 249, + "diffOps": 252, + "diffCursorMoves": 249, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 42.982458000000406, + "renderMs": 0.6723339999998643, + "diffMs": 0.12312500000007276, + "writeMs": 0.0005419999997684499, + "frameMs": 43.78941599999962, + "memory": { + "rss": 292012032, + "heapTotal": 72557568, + "heapUsed": 71409824, + "external": 51689872 + } + }, + { + "id": 58, + "time": 1765733914292, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2162, + "diffCellsChanged": 271, + "diffOps": 274, + "diffCursorMoves": 271, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 41.30124999999998, + "renderMs": 4.835708999999952, + "diffMs": 0.13716599999997925, + "writeMs": 0.0005419999997684499, + "frameMs": 46.2907909999999, + "memory": { + "rss": 292012032, + "heapTotal": 72557568, + "heapUsed": 71409824, + "external": 51689872 + } + }, + { + "id": 59, + "time": 1765733914339, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1441, + "diffCellsChanged": 180, + "diffOps": 183, + "diffCursorMoves": 180, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 43.07791600000019, + "renderMs": 0.6048329999998714, + "diffMs": 0.1360420000000886, + "writeMs": 0.0003339999998388521, + "frameMs": 43.831416999999874, + "memory": { + "rss": 292012032, + "heapTotal": 72557568, + "heapUsed": 73460841, + "external": 51892153 + } + }, + { + "id": 60, + "time": 1765733914384, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1422, + "diffCellsChanged": 178, + "diffOps": 181, + "diffCursorMoves": 178, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 39.696249999999964, + "renderMs": 4.81283300000041, + "diffMs": 0.12387500000022555, + "writeMs": 0.0005419999997684499, + "frameMs": 44.64662499999986, + "memory": { + "rss": 292012032, + "heapTotal": 72557568, + "heapUsed": 73460841, + "external": 51892153 + } + }, + { + "id": 61, + "time": 1765733914430, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2113, + "diffCellsChanged": 266, + "diffOps": 269, + "diffCursorMoves": 266, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 42.10029200000008, + "renderMs": 0.6827910000001793, + "diffMs": 0.12841699999989942, + "writeMs": 0.00045799999998052954, + "frameMs": 42.92254099999991, + "memory": { + "rss": 292012032, + "heapTotal": 72557568, + "heapUsed": 75511602, + "external": 52094434 + } + }, + { + "id": 62, + "time": 1765733914473, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2215, + "diffCellsChanged": 279, + "diffOps": 282, + "diffCursorMoves": 279, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 39.83899999999994, + "renderMs": 4.704000000000178, + "diffMs": 0.12212499999986903, + "writeMs": 0.00029200000017226557, + "frameMs": 44.67787500000031, + "memory": { + "rss": 292012032, + "heapTotal": 72557568, + "heapUsed": 75511602, + "external": 52094434 + } + }, + { + "id": 63, + "time": 1765733914519, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1434, + "diffCellsChanged": 179, + "diffOps": 182, + "diffCursorMoves": 179, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 42.55354099999977, + "renderMs": 0.6339169999996557, + "diffMs": 0.12108399999988251, + "writeMs": 0.0005830000000059954, + "frameMs": 43.31995800000004, + "memory": { + "rss": 292012032, + "heapTotal": 72557568, + "heapUsed": 77562619, + "external": 52296715 + } + }, + { + "id": 64, + "time": 1765733914563, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1435, + "diffCellsChanged": 180, + "diffOps": 183, + "diffCursorMoves": 180, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 39.26608400000032, + "renderMs": 4.86041699999987, + "diffMs": 0.11720800000011877, + "writeMs": 0.00029100000028847717, + "frameMs": 44.255833000000166, + "memory": { + "rss": 292012032, + "heapTotal": 72557568, + "heapUsed": 77562619, + "external": 52296715 + } + }, + { + "id": 65, + "time": 1765733914609, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2028, + "diffCellsChanged": 255, + "diffOps": 258, + "diffCursorMoves": 255, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 42.35183400000005, + "renderMs": 0.6565000000000509, + "diffMs": 0.1305409999999938, + "writeMs": 0.0004169999997429841, + "frameMs": 43.14958300000035, + "memory": { + "rss": 292028416, + "heapTotal": 72557568, + "heapUsed": 79613380, + "external": 52498996 + } + }, + { + "id": 66, + "time": 1765733914653, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2167, + "diffCellsChanged": 272, + "diffOps": 275, + "diffCursorMoves": 272, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 39.39108400000032, + "renderMs": 5.008874999999989, + "diffMs": 0.1319579999999405, + "writeMs": 0.00029200000017226557, + "frameMs": 44.54350000000022, + "memory": { + "rss": 292028416, + "heapTotal": 72557568, + "heapUsed": 79613380, + "external": 52498996 + } + }, + { + "id": 67, + "time": 1765733914698, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1496, + "diffCellsChanged": 187, + "diffOps": 190, + "diffCursorMoves": 187, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 42.20775000000003, + "renderMs": 0.650000000000091, + "diffMs": 0.13524999999981446, + "writeMs": 0.0005000000001018634, + "frameMs": 43.00387499999988, + "memory": { + "rss": 292028416, + "heapTotal": 72557568, + "heapUsed": 81666037, + "external": 52702693 + } + }, + { + "id": 68, + "time": 1765733914743, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1427, + "diffCellsChanged": 179, + "diffOps": 182, + "diffCursorMoves": 179, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 39.95004199999994, + "renderMs": 4.869916000000103, + "diffMs": 0.1253750000000764, + "writeMs": 0.0006659999999101274, + "frameMs": 44.963042000000314, + "memory": { + "rss": 292028416, + "heapTotal": 72557568, + "heapUsed": 81666037, + "external": 50065367 + } + }, + { + "id": 69, + "time": 1765733914789, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1989, + "diffCellsChanged": 249, + "diffOps": 252, + "diffCursorMoves": 249, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 43.59487500000023, + "renderMs": 0.4855420000003505, + "diffMs": 0.15979199999992488, + "writeMs": 0.0005000000001018634, + "frameMs": 44.251666000000114, + "memory": { + "rss": 292028416, + "heapTotal": 72557568, + "heapUsed": 81666037, + "external": 50065367 + } + }, + { + "id": 70, + "time": 1765733914835, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2162, + "diffCellsChanged": 271, + "diffOps": 274, + "diffCursorMoves": 271, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 38.814124999999876, + "renderMs": 4.986625000000004, + "diffMs": 0.1330420000003869, + "writeMs": 0.0005839999998897838, + "frameMs": 43.94608299999982, + "memory": { + "rss": 292044800, + "heapTotal": 72557568, + "heapUsed": 59101460, + "external": 50473428 + } + }, + { + "id": 71, + "time": 1765733914879, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1441, + "diffCellsChanged": 180, + "diffOps": 183, + "diffCursorMoves": 180, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 42.54545899999994, + "renderMs": 0.39312500000005457, + "diffMs": 0.12341699999979028, + "writeMs": 0.00041599999985919567, + "frameMs": 43.071750000000065, + "memory": { + "rss": 292044800, + "heapTotal": 72557568, + "heapUsed": 59101460, + "external": 50473428 + } + }, + { + "id": 72, + "time": 1765733914923, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1422, + "diffCellsChanged": 178, + "diffOps": 181, + "diffCursorMoves": 178, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 39.14666699999998, + "renderMs": 4.8308750000001055, + "diffMs": 0.12066600000025574, + "writeMs": 0.000792000000274129, + "frameMs": 44.11220800000001, + "memory": { + "rss": 292044800, + "heapTotal": 72557568, + "heapUsed": 61152874, + "external": 50676362 + } + }, + { + "id": 73, + "time": 1765733914968, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2113, + "diffCellsChanged": 266, + "diffOps": 269, + "diffCursorMoves": 266, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 44.047541000000365, + "renderMs": 0.5974999999998545, + "diffMs": 0.13262499999973443, + "writeMs": 0.0004169999997429841, + "frameMs": 44.79012499999999, + "memory": { + "rss": 292044800, + "heapTotal": 72557568, + "heapUsed": 61152874, + "external": 50676362 + } + }, + { + "id": 74, + "time": 1765733915014, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2215, + "diffCellsChanged": 279, + "diffOps": 282, + "diffCursorMoves": 279, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 39.915750000000116, + "renderMs": 5.082957999999962, + "diffMs": 0.13891600000033577, + "writeMs": 0.0003749999996216502, + "frameMs": 45.15220800000043, + "memory": { + "rss": 292044800, + "heapTotal": 72557568, + "heapUsed": 63203937, + "external": 50878689 + } + }, + { + "id": 75, + "time": 1765733915060, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1434, + "diffCellsChanged": 179, + "diffOps": 182, + "diffCursorMoves": 179, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 43.48462500000005, + "renderMs": 0.5834580000000642, + "diffMs": 0.1303330000000642, + "writeMs": 0.0007919999998193816, + "frameMs": 44.21308299999964, + "memory": { + "rss": 292044800, + "heapTotal": 72557568, + "heapUsed": 63203937, + "external": 50878689 + } + }, + { + "id": 76, + "time": 1765733915105, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1435, + "diffCellsChanged": 180, + "diffOps": 183, + "diffCursorMoves": 180, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 40.357084000000214, + "renderMs": 4.973541999999725, + "diffMs": 0.12412499999982174, + "writeMs": 0.0005419999997684499, + "frameMs": 45.46829200000002, + "memory": { + "rss": 292044800, + "heapTotal": 72557568, + "heapUsed": 65254698, + "external": 51080970 + } + }, + { + "id": 77, + "time": 1765733915152, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2028, + "diffCellsChanged": 255, + "diffOps": 258, + "diffCursorMoves": 255, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 44.60816699999987, + "renderMs": 0.6772499999997308, + "diffMs": 0.12858399999959147, + "writeMs": 0.0005419999997684499, + "frameMs": 45.42666700000018, + "memory": { + "rss": 292044800, + "heapTotal": 72557568, + "heapUsed": 65254698, + "external": 51080970 + } + }, + { + "id": 78, + "time": 1765733915198, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2167, + "diffCellsChanged": 272, + "diffOps": 275, + "diffCursorMoves": 272, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 40.65804100000014, + "renderMs": 5.053291000000172, + "diffMs": 0.13379099999974642, + "writeMs": 0.0006250000001273293, + "frameMs": 45.857708, + "memory": { + "rss": 292044800, + "heapTotal": 72557568, + "heapUsed": 67305715, + "external": 51283251 + } + }, + { + "id": 79, + "time": 1765733915245, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1496, + "diffCellsChanged": 187, + "diffOps": 190, + "diffCursorMoves": 187, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 44.18995799999993, + "renderMs": 0.6339579999998932, + "diffMs": 0.12333300000000236, + "writeMs": 0.00016699999969205237, + "frameMs": 44.95870799999966, + "memory": { + "rss": 292044800, + "heapTotal": 72557568, + "heapUsed": 67305715, + "external": 51283251 + } + }, + { + "id": 80, + "time": 1765733915291, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1427, + "diffCellsChanged": 179, + "diffOps": 182, + "diffCursorMoves": 179, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 40.49866599999996, + "renderMs": 4.912416000000121, + "diffMs": 0.12454200000001947, + "writeMs": 0.0003749999996216502, + "frameMs": 45.549790999999914, + "memory": { + "rss": 292044800, + "heapTotal": 72557568, + "heapUsed": 69356476, + "external": 51485532 + } + }, + { + "id": 81, + "time": 1765733915337, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1989, + "diffCellsChanged": 249, + "diffOps": 252, + "diffCursorMoves": 249, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 43.315833999999995, + "renderMs": 0.653791000000183, + "diffMs": 0.12291700000014316, + "writeMs": 0.0004170000001977314, + "frameMs": 44.106292000000394, + "memory": { + "rss": 292044800, + "heapTotal": 72557568, + "heapUsed": 69356476, + "external": 51485532 + } + }, + { + "id": 82, + "time": 1765733915383, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2162, + "diffCellsChanged": 271, + "diffOps": 274, + "diffCursorMoves": 271, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 43.178292000000056, + "renderMs": 5.18466699999999, + "diffMs": 0.1532919999999649, + "writeMs": 0.0005420000002231973, + "frameMs": 48.530665999999655, + "memory": { + "rss": 292405248, + "heapTotal": 72557568, + "heapUsed": 71407493, + "external": 51687813 + } + }, + { + "id": 83, + "time": 1765733915432, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1441, + "diffCellsChanged": 180, + "diffOps": 183, + "diffCursorMoves": 180, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 43.998499999999694, + "renderMs": 0.5540410000003249, + "diffMs": 0.11787499999991269, + "writeMs": 0.0005420000002231973, + "frameMs": 44.683958000000075, + "memory": { + "rss": 292421632, + "heapTotal": 72557568, + "heapUsed": 71407493, + "external": 51687813 + } + }, + { + "id": 84, + "time": 1765733915478, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "diffCellsChanged": 0, + "diffOps": 0, + "diffCursorMoves": 0, + "diffStyleChanges": 0, + "diffResets": 0, + "diffFullRedraw": false, + "layoutMs": 43.91062499999998, + "renderMs": 0.5242499999999382, + "diffMs": 0.11099999999987631, + "writeMs": 0, + "frameMs": 44.55804100000023, + "memory": { + "rss": 292438016, + "heapTotal": 72557568, + "heapUsed": 74078228, + "external": 51905300 + } + }, + { + "id": 85, + "time": 1765733915522, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1422, + "diffCellsChanged": 178, + "diffOps": 181, + "diffCursorMoves": 178, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 39.93712500000038, + "renderMs": 4.707792000000154, + "diffMs": 0.1216669999998885, + "writeMs": 0.00045799999998052954, + "frameMs": 44.78125, + "memory": { + "rss": 292438016, + "heapTotal": 72557568, + "heapUsed": 74078228, + "external": 51905300 + } + }, + { + "id": 86, + "time": 1765733915568, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2113, + "diffCellsChanged": 266, + "diffOps": 269, + "diffCursorMoves": 266, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 43.500082999999904, + "renderMs": 0.5656670000003032, + "diffMs": 0.1380410000001575, + "writeMs": 0.00045799999998052954, + "frameMs": 44.21787499999982, + "memory": { + "rss": 292438016, + "heapTotal": 72557568, + "heapUsed": 74078228, + "external": 50064851 + } + }, + { + "id": 87, + "time": 1765733915613, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2215, + "diffCellsChanged": 279, + "diffOps": 282, + "diffCursorMoves": 279, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 40.480458, + "renderMs": 4.807416999999987, + "diffMs": 0.1483339999999771, + "writeMs": 0.0006249999996725819, + "frameMs": 45.45100000000002, + "memory": { + "rss": 292438016, + "heapTotal": 72557568, + "heapUsed": 57072084, + "external": 50270404 + } + }, + { + "id": 88, + "time": 1765733915659, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1434, + "diffCellsChanged": 179, + "diffOps": 182, + "diffCursorMoves": 179, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 43.117707999999766, + "renderMs": 0.4941660000004049, + "diffMs": 0.13254200000028504, + "writeMs": 0.00033400000029359944, + "frameMs": 43.757958000000144, + "memory": { + "rss": 292438016, + "heapTotal": 72557568, + "heapUsed": 59113956, + "external": 50475316 + } + }, + { + "id": 89, + "time": 1765733915703, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1435, + "diffCellsChanged": 180, + "diffOps": 183, + "diffCursorMoves": 180, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 40.43304199999966, + "renderMs": 4.7939580000002024, + "diffMs": 0.12349999999969441, + "writeMs": 0.0005410000003394089, + "frameMs": 45.3647919999994, + "memory": { + "rss": 292438016, + "heapTotal": 72557568, + "heapUsed": 59113956, + "external": 50475316 + } + }, + { + "id": 90, + "time": 1765733915750, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2028, + "diffCellsChanged": 255, + "diffOps": 258, + "diffCursorMoves": 255, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 46.170875000000706, + "renderMs": 0.5774169999995138, + "diffMs": 0.1367919999993319, + "writeMs": 0.0004169999992882367, + "frameMs": 46.897917000000234, + "memory": { + "rss": 292438016, + "heapTotal": 72557568, + "heapUsed": 61166367, + "external": 50678991 + } + }, + { + "id": 91, + "time": 1765733915797, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2167, + "diffCellsChanged": 272, + "diffOps": 275, + "diffCursorMoves": 272, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 40.34504099999958, + "renderMs": 4.70495899999969, + "diffMs": 0.14279200000055425, + "writeMs": 0.0005419999997684499, + "frameMs": 45.20666700000038, + "memory": { + "rss": 292438016, + "heapTotal": 72557568, + "heapUsed": 61166367, + "external": 50678991 + } + }, + { + "id": 92, + "time": 1765733915843, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1496, + "diffCellsChanged": 187, + "diffOps": 190, + "diffCursorMoves": 187, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 43.055999999999585, + "renderMs": 0.5096669999993537, + "diffMs": 0.12850000000071304, + "writeMs": 0.0003329999999550637, + "frameMs": 43.70600000000013, + "memory": { + "rss": 292438016, + "heapTotal": 72557568, + "heapUsed": 63218372, + "external": 50882516 + } + }, + { + "id": 93, + "time": 1765733915887, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1427, + "diffCellsChanged": 179, + "diffOps": 182, + "diffCursorMoves": 179, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 40.06758400000035, + "renderMs": 4.732124999999542, + "diffMs": 0.13099999999940337, + "writeMs": 0.0007080000004862086, + "frameMs": 44.94987500000025, + "memory": { + "rss": 292438016, + "heapTotal": 72557568, + "heapUsed": 63218372, + "external": 50882516 + } + }, + { + "id": 94, + "time": 1765733915933, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1989, + "diffCellsChanged": 249, + "diffOps": 252, + "diffCursorMoves": 249, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 42.95116700000017, + "renderMs": 0.5744580000000497, + "diffMs": 0.14991700000064156, + "writeMs": 0.0003329999999550637, + "frameMs": 43.68720899999971, + "memory": { + "rss": 292438016, + "heapTotal": 72557568, + "heapUsed": 65269409, + "external": 51084817 + } + }, + { + "id": 95, + "time": 1765733915976, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2162, + "diffCellsChanged": 271, + "diffOps": 274, + "diffCursorMoves": 271, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 40.61537500000031, + "renderMs": 4.6709579999997, + "diffMs": 0.1358749999999418, + "writeMs": 0.0004580000004352769, + "frameMs": 45.43541699999969, + "memory": { + "rss": 292438016, + "heapTotal": 72557568, + "heapUsed": 65269409, + "external": 51084817 + } + }, + { + "id": 96, + "time": 1765733916023, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1441, + "diffCellsChanged": 180, + "diffOps": 183, + "diffCursorMoves": 180, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 47.73400000000038, + "renderMs": 0.4836669999995138, + "diffMs": 0.129041999999572, + "writeMs": 0.0005000000001018634, + "frameMs": 48.362833999999566, + "memory": { + "rss": 292438016, + "heapTotal": 72557568, + "heapUsed": 67320770, + "external": 51287474 + } + }, + { + "id": 97, + "time": 1765733916071, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1422, + "diffCellsChanged": 178, + "diffOps": 181, + "diffCursorMoves": 178, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 41.647375000000466, + "renderMs": 4.619082999999591, + "diffMs": 0.12641700000040146, + "writeMs": 0.0005419999997684499, + "frameMs": 46.4096669999999, + "memory": { + "rss": 292438016, + "heapTotal": 72557568, + "heapUsed": 67320770, + "external": 51287474 + } + }, + { + "id": 98, + "time": 1765733916119, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2113, + "diffCellsChanged": 266, + "diffOps": 269, + "diffCursorMoves": 266, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 42.83241700000053, + "renderMs": 0.5484999999998763, + "diffMs": 0.13079199999992852, + "writeMs": 0.0004579999995257822, + "frameMs": 43.52374999999938, + "memory": { + "rss": 292438016, + "heapTotal": 72557568, + "heapUsed": 69371787, + "external": 50069538 + } + }, + { + "id": 99, + "time": 1765733916163, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2215, + "diffCellsChanged": 279, + "diffOps": 282, + "diffCursorMoves": 279, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 40.11304199999995, + "renderMs": 4.618959000000359, + "diffMs": 0.12954200000058336, + "writeMs": 0.0126669999999649, + "frameMs": 44.88625000000047, + "memory": { + "rss": 292438016, + "heapTotal": 72557568, + "heapUsed": 69371787, + "external": 50069538 + } + }, + { + "id": 100, + "time": 1765733916209, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1434, + "diffCellsChanged": 179, + "diffOps": 182, + "diffCursorMoves": 179, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 43.07920800000011, + "renderMs": 0.49620800000047893, + "diffMs": 0.13166699999965203, + "writeMs": 0.0005830000000059954, + "frameMs": 43.73479099999986, + "memory": { + "rss": 292438016, + "heapTotal": 72557568, + "heapUsed": 57067738, + "external": 50275690 + } + }, + { + "id": 101, + "time": 1765733916253, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1435, + "diffCellsChanged": 180, + "diffOps": 183, + "diffCursorMoves": 180, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 40.336207999999715, + "renderMs": 4.668542000000343, + "diffMs": 0.13258399999995163, + "writeMs": 0.00045899999986431794, + "frameMs": 45.1904999999997, + "memory": { + "rss": 292438016, + "heapTotal": 72557568, + "heapUsed": 57067738, + "external": 50275690 + } + }, + { + "id": 102, + "time": 1765733916299, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2036, + "diffCellsChanged": 256, + "diffOps": 259, + "diffCursorMoves": 256, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 47.840165999999954, + "renderMs": 0.5673340000003009, + "diffMs": 0.1340409999993426, + "writeMs": 0.001291999999921245, + "frameMs": 48.57979199999954, + "memory": { + "rss": 292438016, + "heapTotal": 72557568, + "heapUsed": 59136814, + "external": 50492254 + } + }, + { + "id": 103, + "time": 1765733916348, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2183, + "diffCellsChanged": 274, + "diffOps": 277, + "diffCursorMoves": 274, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 40.20366699999977, + "renderMs": 4.75879199999963, + "diffMs": 0.13137499999993452, + "writeMs": 0.00008300000081362668, + "frameMs": 45.12174999999934, + "memory": { + "rss": 292438016, + "heapTotal": 72557568, + "heapUsed": 59136814, + "external": 50492254 + } + }, + { + "id": 104, + "time": 1765733916394, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1512, + "diffCellsChanged": 189, + "diffOps": 192, + "diffCursorMoves": 189, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 43.04412500000035, + "renderMs": 0.48649999999997817, + "diffMs": 0.13991700000042329, + "writeMs": 0.0002919999997175182, + "frameMs": 43.68291600000066, + "memory": { + "rss": 292438016, + "heapTotal": 72557568, + "heapUsed": 61193880, + "external": 50699944 + } + }, + { + "id": 105, + "time": 1765733916438, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1435, + "diffCellsChanged": 180, + "diffOps": 183, + "diffCursorMoves": 180, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 40.918249999999716, + "renderMs": 4.68854199999987, + "diffMs": 0.14058399999976245, + "writeMs": 0.0001249999995707185, + "frameMs": 45.759500000000116, + "memory": { + "rss": 292438016, + "heapTotal": 72557568, + "heapUsed": 61193880, + "external": 50699944 + } + }, + { + "id": 106, + "time": 1765733916484, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1997, + "diffCellsChanged": 250, + "diffOps": 253, + "diffCursorMoves": 250, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 42.749665999999706, + "renderMs": 0.525166000000354, + "diffMs": 0.12466700000004494, + "writeMs": 0.00004200000057608122, + "frameMs": 43.41150000000016, + "memory": { + "rss": 292438016, + "heapTotal": 72557568, + "heapUsed": 63246579, + "external": 50903907 + } + }, + { + "id": 107, + "time": 1765733916528, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2178, + "diffCellsChanged": 273, + "diffOps": 276, + "diffCursorMoves": 273, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 39.536834000000454, + "renderMs": 4.646083000000544, + "diffMs": 0.13179200000013225, + "writeMs": 0.000249999999141437, + "frameMs": 44.32629100000031, + "memory": { + "rss": 292438016, + "heapTotal": 72557568, + "heapUsed": 63246579, + "external": 50903907 + } + }, + { + "id": 108, + "time": 1765733916573, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1449, + "diffCellsChanged": 181, + "diffOps": 184, + "diffCursorMoves": 181, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 43.022917000000234, + "renderMs": 0.49112499999955617, + "diffMs": 0.13670900000033726, + "writeMs": 0.00016700000014679972, + "frameMs": 43.661833000000115, + "memory": { + "rss": 292438016, + "heapTotal": 72557568, + "heapUsed": 65297341, + "external": 51106189 + } + }, + { + "id": 109, + "time": 1765733916617, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1430, + "diffCellsChanged": 179, + "diffOps": 182, + "diffCursorMoves": 179, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 39.648583000000144, + "renderMs": 4.766999999999825, + "diffMs": 0.13320799999928568, + "writeMs": 0.0002500000000509317, + "frameMs": 44.56066600000031, + "memory": { + "rss": 292438016, + "heapTotal": 72557568, + "heapUsed": 67348583, + "external": 51308471 + } + }, + { + "id": 110, + "time": 1765733916663, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2121, + "diffCellsChanged": 267, + "diffOps": 270, + "diffCursorMoves": 267, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 43.47187500000018, + "renderMs": 0.6000000000003638, + "diffMs": 0.1265000000003056, + "writeMs": 0.0001249999995707185, + "frameMs": 44.208832999999686, + "memory": { + "rss": 292438016, + "heapTotal": 72557568, + "heapUsed": 69400663, + "external": 51512183 + } + }, + { + "id": 111, + "time": 1765733916707, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2231, + "diffCellsChanged": 281, + "diffOps": 284, + "diffCursorMoves": 281, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 38.853667000000314, + "renderMs": 4.597625000000335, + "diffMs": 0.12758299999950395, + "writeMs": 0.00029099999937898247, + "frameMs": 43.59016699999938, + "memory": { + "rss": 292438016, + "heapTotal": 72557568, + "heapUsed": 69400663, + "external": 51512183 + } + }, + { + "id": 112, + "time": 1765733916751, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1442, + "diffCellsChanged": 180, + "diffOps": 183, + "diffCursorMoves": 180, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 42.40825000000041, + "renderMs": 0.49866600000041217, + "diffMs": 0.13625000000047294, + "writeMs": 0.00008299999990413198, + "frameMs": 43.053750000000036, + "memory": { + "rss": 292438016, + "heapTotal": 72557568, + "heapUsed": 71456001, + "external": 51717041 + } + }, + { + "id": 113, + "time": 1765733916795, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1443, + "diffCellsChanged": 181, + "diffOps": 184, + "diffCursorMoves": 181, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 39.73816699999952, + "renderMs": 4.697291999999834, + "diffMs": 0.1226249999999709, + "writeMs": 0.0002920000006270129, + "frameMs": 44.569792000000234, + "memory": { + "rss": 292438016, + "heapTotal": 72557568, + "heapUsed": 71456001, + "external": 51717041 + } + }, + { + "id": 114, + "time": 1765733916840, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2036, + "diffCellsChanged": 256, + "diffOps": 259, + "diffCursorMoves": 256, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 43.484167000000525, + "renderMs": 0.5354589999997188, + "diffMs": 0.12879099999918253, + "writeMs": 0.00008400000024266774, + "frameMs": 44.15899999999965, + "memory": { + "rss": 292438016, + "heapTotal": 72557568, + "heapUsed": 73507019, + "external": 51919323 + } + }, + { + "id": 115, + "time": 1765733916884, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2183, + "diffCellsChanged": 274, + "diffOps": 277, + "diffCursorMoves": 274, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 39.015041999999994, + "renderMs": 4.636792000000241, + "diffMs": 0.1305419999998776, + "writeMs": 0.00016700000014679972, + "frameMs": 43.792875000000095, + "memory": { + "rss": 292438016, + "heapTotal": 72557568, + "heapUsed": 73507019, + "external": 51919323 + } + }, + { + "id": 116, + "time": 1765733916929, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1512, + "diffCellsChanged": 189, + "diffOps": 192, + "diffCursorMoves": 189, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 42.08249999999953, + "renderMs": 0.521708000000217, + "diffMs": 0.11983299999974406, + "writeMs": 0.00004200000057608122, + "frameMs": 42.73216700000012, + "memory": { + "rss": 292438016, + "heapTotal": 72557568, + "heapUsed": 75557781, + "external": 52121605 + } + }, + { + "id": 117, + "time": 1765733916972, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1435, + "diffCellsChanged": 180, + "diffOps": 183, + "diffCursorMoves": 180, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 39.13275000000067, + "renderMs": 4.6444159999991825, + "diffMs": 0.118916999999783, + "writeMs": 0.0001249999995707185, + "frameMs": 43.90558299999975, + "memory": { + "rss": 292438016, + "heapTotal": 72557568, + "heapUsed": 75557781, + "external": 52121605 + } + }, + { + "id": 118, + "time": 1765733917017, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1997, + "diffCellsChanged": 250, + "diffOps": 253, + "diffCursorMoves": 250, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 42.40045800000007, + "renderMs": 0.5571669999999358, + "diffMs": 0.1257500000001528, + "writeMs": 0.00008299999990413198, + "frameMs": 43.09370899999976, + "memory": { + "rss": 292438016, + "heapTotal": 72557568, + "heapUsed": 77608799, + "external": 52323887 + } + }, + { + "id": 119, + "time": 1765733917060, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 2178, + "diffCellsChanged": 273, + "diffOps": 276, + "diffCursorMoves": 273, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 39.384125000000495, + "renderMs": 4.649042000000009, + "diffMs": 0.13887500000055297, + "writeMs": 0.0002500000000509317, + "frameMs": 44.18237500000032, + "memory": { + "rss": 292438016, + "heapTotal": 72557568, + "heapUsed": 77608799, + "external": 52323887 + } + }, + { + "id": 120, + "time": 1765733917105, + "rows": 40, + "cols": 120, + "nodeCount": 8002, + "outputBytes": 1449, + "diffCellsChanged": 181, + "diffOps": 184, + "diffCursorMoves": 181, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 42.50187499999993, + "renderMs": 0.508958000000348, + "diffMs": 0.1172500000002401, + "writeMs": 0.00004200000057608122, + "frameMs": 43.13804199999959, + "memory": { + "rss": 292438016, + "heapTotal": 72557568, + "heapUsed": 79662017, + "external": 49737181 + } + } + ], + "summary": { + "frameCount": 120, + "frameMs": { + "p50": 44.683958000000075, + "p95": 48.57979199999954, + "p99": 52.765957999999955, + "max": 54.4745 + }, + "totals": { + "layoutMs": 5068.675703000005, + "renderMs": 330.06558100000126, + "diffMs": 16.14816799999909, + "writeMs": 0.07530299999626777, + "frameMs": 5417.250871999999 + } + } +} \ No newline at end of file diff --git a/profiles/stress-1765732169537.json b/profiles/stress-1765732169537.json new file mode 100644 index 0000000..e872fc1 --- /dev/null +++ b/profiles/stress-1765732169537.json @@ -0,0 +1,3023 @@ +{ + "version": 1, + "startedAt": "2025-12-14T17:09:29.539Z", + "endedAt": "2025-12-14T17:09:46.874Z", + "frames": [ + { + "id": 1, + "time": 1765732169547, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 2584, + "diffCellsChanged": 330, + "diffOps": 333, + "diffCursorMoves": 330, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 56.839332999999996, + "renderMs": 92.93191599999999, + "diffMs": 0.4253749999999741, + "writeMs": 0.012334000000009837, + "frameMs": 150.60225, + "memory": { + "rss": 675446784, + "heapTotal": 95998976, + "heapUsed": 36985778, + "external": 85047925 + } + }, + { + "id": 2, + "time": 1765732169699, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 53, + "renderMs": 97.67104099999997, + "diffMs": 0.17024999999995316, + "writeMs": 0.0017500000000154614, + "frameMs": 150.88266599999997, + "memory": { + "rss": 695074816, + "heapTotal": 105964544, + "heapUsed": 97843837, + "external": 85248077 + } + }, + { + "id": 3, + "time": 1765732169851, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 49.826167, + "renderMs": 71.87629199999998, + "diffMs": 0.10654099999999289, + "writeMs": 0.0023329999999646134, + "frameMs": 121.833708, + "memory": { + "rss": 695959552, + "heapTotal": 105948160, + "heapUsed": 97945874, + "external": 85311394 + } + }, + { + "id": 4, + "time": 1765732169973, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 52.54704099999998, + "renderMs": 76.00291599999997, + "diffMs": 0.10608400000000984, + "writeMs": 0.0004999999999881766, + "frameMs": 128.67874999999998, + "memory": { + "rss": 1182236672, + "heapTotal": 185492480, + "heapUsed": 97945874, + "external": 85311394 + } + }, + { + "id": 5, + "time": 1765732170103, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 52.997499999999945, + "renderMs": 71.054125, + "diffMs": 0.08570800000006784, + "writeMs": 0.0013750000000527507, + "frameMs": 124.16187500000001, + "memory": { + "rss": 1182236672, + "heapTotal": 173515776, + "heapUsed": 98401263, + "external": 85748255 + } + }, + { + "id": 6, + "time": 1765732170237, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 49.104832999999985, + "renderMs": 73.396209, + "diffMs": 0.1043329999999969, + "writeMs": 0.0016669999999976426, + "frameMs": 122.62895800000001, + "memory": { + "rss": 1182695424, + "heapTotal": 100803584, + "heapUsed": 98435098, + "external": 85764794 + } + }, + { + "id": 7, + "time": 1765732170370, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 51.99766699999998, + "renderMs": 78.84866599999998, + "diffMs": 0.12358400000005076, + "writeMs": 0.0012909999999237698, + "frameMs": 130.993834, + "memory": { + "rss": 1182728192, + "heapTotal": 99329024, + "heapUsed": 98464265, + "external": 85777065 + } + }, + { + "id": 8, + "time": 1765732170502, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 53.40479200000004, + "renderMs": 86.14154200000007, + "diffMs": 0.1454999999998563, + "writeMs": 0.00045799999998052954, + "frameMs": 139.7137919999999, + "memory": { + "rss": 1182777344, + "heapTotal": 172745728, + "heapUsed": 98464265, + "external": 85777065 + } + }, + { + "id": 9, + "time": 1765732170642, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 48.65375000000017, + "renderMs": 78.95837499999993, + "diffMs": 0.13779100000010658, + "writeMs": 0.0025829999999587017, + "frameMs": 127.79516599999988, + "memory": { + "rss": 1182810112, + "heapTotal": 172745728, + "heapUsed": 98486035, + "external": 85781587 + } + }, + { + "id": 10, + "time": 1765732170770, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 49.23566600000004, + "renderMs": 95.09279199999992, + "diffMs": 0.11441600000011931, + "writeMs": 0.0002500000000509317, + "frameMs": 144.46958300000006, + "memory": { + "rss": 1187037184, + "heapTotal": 172762112, + "heapUsed": 98486035, + "external": 85781587 + } + }, + { + "id": 11, + "time": 1765732170915, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 25, + "diffCellsChanged": 2, + "diffOps": 4, + "diffCursorMoves": 2, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 48.15087500000004, + "renderMs": 75.78079200000002, + "diffMs": 0.11387500000000728, + "writeMs": 0.0005830000000059954, + "frameMs": 124.06679200000008, + "memory": { + "rss": 1187037184, + "heapTotal": 172762112, + "heapUsed": 98509006, + "external": 85786606 + } + }, + { + "id": 12, + "time": 1765732171049, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 49.02254199999993, + "renderMs": 80.25179200000002, + "diffMs": 0.10954099999980826, + "writeMs": 0.0006249999998999556, + "frameMs": 129.40645800000016, + "memory": { + "rss": 1187037184, + "heapTotal": 100836352, + "heapUsed": 98527666, + "external": 85788674 + } + }, + { + "id": 13, + "time": 1765732171190, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 49.04704200000015, + "renderMs": 116.4251670000001, + "diffMs": 0.11783300000001873, + "writeMs": 0.00020900000004075991, + "frameMs": 165.6120840000001, + "memory": { + "rss": 1187053568, + "heapTotal": 99329024, + "heapUsed": 98546326, + "external": 85790742 + } + }, + { + "id": 14, + "time": 1765732171355, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 51.18816600000014, + "renderMs": 111.19158400000015, + "diffMs": 0.11408400000004804, + "writeMs": 0.0002500000000509317, + "frameMs": 162.52229199999988, + "memory": { + "rss": 1187069952, + "heapTotal": 172811264, + "heapUsed": 98546326, + "external": 85790742 + } + }, + { + "id": 15, + "time": 1765732171518, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 50.54500000000007, + "renderMs": 86.61737500000027, + "diffMs": 0.12829199999987395, + "writeMs": 0.0007089999999152496, + "frameMs": 137.33537499999989, + "memory": { + "rss": 1187069952, + "heapTotal": 172811264, + "heapUsed": 98565450, + "external": 85792810 + } + }, + { + "id": 16, + "time": 1765732171666, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 50.80074999999988, + "renderMs": 93.90391700000009, + "diffMs": 0.14179199999989578, + "writeMs": 0.0006250000001273293, + "frameMs": 144.8710000000001, + "memory": { + "rss": 1187086336, + "heapTotal": 100705280, + "heapUsed": 98584246, + "external": 85794966 + } + }, + { + "id": 17, + "time": 1765732171812, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 48.938666999999896, + "renderMs": 87.06466599999976, + "diffMs": 0.1184160000002521, + "writeMs": 0.0007080000000314612, + "frameMs": 136.160167, + "memory": { + "rss": 1187119104, + "heapTotal": 100705280, + "heapUsed": 98602906, + "external": 85797034 + } + }, + { + "id": 18, + "time": 1765732171959, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 52.05891699999984, + "renderMs": 96.0694999999996, + "diffMs": 0.11887499999966167, + "writeMs": 0.00029200000017226557, + "frameMs": 148.28258300000016, + "memory": { + "rss": 1187135488, + "heapTotal": 98968576, + "heapUsed": 98624718, + "external": 85801678 + } + }, + { + "id": 19, + "time": 1765732172118, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 51.32045900000003, + "renderMs": 89.89945799999987, + "diffMs": 0.11045800000010786, + "writeMs": 0.00045899999986431794, + "frameMs": 141.35550000000012, + "memory": { + "rss": 1187135488, + "heapTotal": 97657856, + "heapUsed": 98643706, + "external": 85803834 + } + }, + { + "id": 20, + "time": 1765732172259, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 49.551000000000386, + "renderMs": 94.23833300000024, + "diffMs": 0.12112500000012005, + "writeMs": 0.0005000000001018634, + "frameMs": 143.93358399999988, + "memory": { + "rss": 1187151872, + "heapTotal": 172893184, + "heapUsed": 98643706, + "external": 85803834 + } + }, + { + "id": 21, + "time": 1765732172404, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 25, + "diffCellsChanged": 2, + "diffOps": 4, + "diffCursorMoves": 2, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 49.3472499999998, + "renderMs": 82.93458400000009, + "diffMs": 0.12049999999999272, + "writeMs": 0.0005830000000059954, + "frameMs": 132.42641700000013, + "memory": { + "rss": 1187151872, + "heapTotal": 172893184, + "heapUsed": 98663022, + "external": 85805902 + } + }, + { + "id": 22, + "time": 1765732172547, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 49.34233399999994, + "renderMs": 89.00129199999992, + "diffMs": 0.12208300000020245, + "writeMs": 0.0007500000001527951, + "frameMs": 138.48920799999996, + "memory": { + "rss": 1187151872, + "heapTotal": 100721664, + "heapUsed": 98682074, + "external": 85808058 + } + }, + { + "id": 23, + "time": 1765732172686, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 57.267333000000235, + "renderMs": 81.45850000000019, + "diffMs": 0.10837499999979627, + "writeMs": 0.0006250000001273293, + "frameMs": 138.85520799999995, + "memory": { + "rss": 1187151872, + "heapTotal": 100721664, + "heapUsed": 98700734, + "external": 85810126 + } + }, + { + "id": 24, + "time": 1765732172835, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 49.90666699999974, + "renderMs": 89.26633300000003, + "diffMs": 0.12945899999976973, + "writeMs": 0.0005839999998897838, + "frameMs": 139.32337499999994, + "memory": { + "rss": 1187151872, + "heapTotal": 99050496, + "heapUsed": 98719394, + "external": 85812194 + } + }, + { + "id": 25, + "time": 1765732172985, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 49.574041999999736, + "renderMs": 84.0522920000003, + "diffMs": 0.11608299999988958, + "writeMs": 0.0005420000002231973, + "frameMs": 133.765042, + "memory": { + "rss": 1187151872, + "heapTotal": 97494016, + "heapUsed": 98738054, + "external": 85814262 + } + }, + { + "id": 26, + "time": 1765732173119, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 52.41966700000012, + "renderMs": 97.52729099999988, + "diffMs": 0.12029200000006313, + "writeMs": 0.00029200000017226557, + "frameMs": 150.088209, + "memory": { + "rss": 1187151872, + "heapTotal": 172991488, + "heapUsed": 98738054, + "external": 85814262 + } + }, + { + "id": 27, + "time": 1765732173270, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 49.656124999999975, + "renderMs": 80.90558299999975, + "diffMs": 0.12445900000011534, + "writeMs": 0.0006249999996725819, + "frameMs": 130.71116699999993, + "memory": { + "rss": 1187151872, + "heapTotal": 172991488, + "heapUsed": 98757890, + "external": 85816818 + } + }, + { + "id": 28, + "time": 1765732173411, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 54.71629199999961, + "renderMs": 90.17999999999984, + "diffMs": 0.11995900000010806, + "writeMs": 0.0007080000000314612, + "frameMs": 145.04154100000005, + "memory": { + "rss": 1187151872, + "heapTotal": 100918272, + "heapUsed": 98776550, + "external": 85818886 + } + }, + { + "id": 29, + "time": 1765732173567, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 51.128333000000566, + "renderMs": 86.09250000000065, + "diffMs": 0.118916999999783, + "writeMs": 0.0005410000003394089, + "frameMs": 137.37562499999967, + "memory": { + "rss": 1187151872, + "heapTotal": 99394560, + "heapUsed": 98795346, + "external": 85821042 + } + }, + { + "id": 30, + "time": 1765732173705, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 52.00804200000039, + "renderMs": 102.06758300000001, + "diffMs": 0.13141600000017206, + "writeMs": 0.0003329999999550637, + "frameMs": 154.23008300000038, + "memory": { + "rss": 1187151872, + "heapTotal": 173040640, + "heapUsed": 98795346, + "external": 85821042 + } + }, + { + "id": 31, + "time": 1765732173859, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 25, + "diffCellsChanged": 2, + "diffOps": 4, + "diffCursorMoves": 2, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 49.3402500000002, + "renderMs": 80.53787499999999, + "diffMs": 0.1422920000004524, + "writeMs": 0.00041599999985919567, + "frameMs": 130.04508299999998, + "memory": { + "rss": 1187151872, + "heapTotal": 173040640, + "heapUsed": 98814470, + "external": 85823110 + } + }, + { + "id": 32, + "time": 1765732174000, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 54.20970800000032, + "renderMs": 82.00595799999974, + "diffMs": 0.12120899999990797, + "writeMs": 0.0007909999994808459, + "frameMs": 136.358792, + "memory": { + "rss": 1187151872, + "heapTotal": 100951040, + "heapUsed": 98833130, + "external": 85825178 + } + }, + { + "id": 33, + "time": 1765732174147, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 52.28583299999991, + "renderMs": 81.5590000000002, + "diffMs": 0.10395800000060262, + "writeMs": 0.0007500000001527951, + "frameMs": 133.97429199999988, + "memory": { + "rss": 1187151872, + "heapTotal": 99329024, + "heapUsed": 98852222, + "external": 85827246 + } + }, + { + "id": 34, + "time": 1765732174281, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 52.53495899999962, + "renderMs": 99.0132080000003, + "diffMs": 0.11716599999999744, + "writeMs": 0.0007079999995767139, + "frameMs": 151.69650000000001, + "memory": { + "rss": 1187184640, + "heapTotal": 173106176, + "heapUsed": 98852222, + "external": 85827246 + } + }, + { + "id": 35, + "time": 1765732174434, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 49.661417000000256, + "renderMs": 77.33358300000054, + "diffMs": 0.1152910000000702, + "writeMs": 0.0007079999995767139, + "frameMs": 127.15041699999983, + "memory": { + "rss": 1187250176, + "heapTotal": 173106176, + "heapUsed": 98874146, + "external": 85831890 + } + }, + { + "id": 36, + "time": 1765732174572, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 48.93891699999949, + "renderMs": 81.09483400000045, + "diffMs": 0.10999999999967258, + "writeMs": 0.0005420000006779446, + "frameMs": 130.20670800000062, + "memory": { + "rss": 1187250176, + "heapTotal": 101032960, + "heapUsed": 98893910, + "external": 85834406 + } + }, + { + "id": 37, + "time": 1765732174702, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 48.600500000000466, + "renderMs": 77.83008299999983, + "diffMs": 0.11954100000002654, + "writeMs": 0.004249999999956344, + "frameMs": 126.5986670000002, + "memory": { + "rss": 1187676160, + "heapTotal": 101393408, + "heapUsed": 99919491, + "external": 86230403 + } + }, + { + "id": 38, + "time": 1765732174839, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 49.40162500000042, + "renderMs": 81.45504100000016, + "diffMs": 0.13504199999988487, + "writeMs": 0.00204200000007404, + "frameMs": 131.01941699999952, + "memory": { + "rss": 1187692544, + "heapTotal": 99705856, + "heapUsed": 99938503, + "external": 86232471 + } + }, + { + "id": 39, + "time": 1765732174981, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 50.16108299999996, + "renderMs": 81.5913330000003, + "diffMs": 0.11291700000037963, + "writeMs": 0.001457999999729509, + "frameMs": 131.88550000000032, + "memory": { + "rss": 1187692544, + "heapTotal": 98247680, + "heapUsed": 99957163, + "external": 86234539 + } + }, + { + "id": 40, + "time": 1765732175113, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 50.18187500000022, + "renderMs": 92.47233299999971, + "diffMs": 0.11733300000014424, + "writeMs": 0.0005839999994350364, + "frameMs": 142.79058300000088, + "memory": { + "rss": 1187692544, + "heapTotal": 173679616, + "heapUsed": 99957163, + "external": 86234539 + } + }, + { + "id": 41, + "time": 1765732175256, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 25, + "diffCellsChanged": 2, + "diffOps": 4, + "diffCursorMoves": 2, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 49.68333299999995, + "renderMs": 78.03904200000034, + "diffMs": 0.12004199999955745, + "writeMs": 0.0005840000003445311, + "frameMs": 127.86391599999934, + "memory": { + "rss": 1187889152, + "heapTotal": 173679616, + "heapUsed": 99976031, + "external": 86236607 + } + }, + { + "id": 42, + "time": 1765732175395, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 56.15766699999949, + "renderMs": 86.83583400000043, + "diffMs": 0.12266699999963748, + "writeMs": 0.0006250000005820766, + "frameMs": 143.13675000000057, + "memory": { + "rss": 1187889152, + "heapTotal": 101606400, + "heapUsed": 99995619, + "external": 86239123 + } + }, + { + "id": 43, + "time": 1765732175549, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 52.35870799999975, + "renderMs": 83.84541699999954, + "diffMs": 0.12529199999971752, + "writeMs": 0.0006659999999101274, + "frameMs": 136.35520799999995, + "memory": { + "rss": 1187889152, + "heapTotal": 100066304, + "heapUsed": 100014279, + "external": 86241191 + } + }, + { + "id": 44, + "time": 1765732175685, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 50.8187080000007, + "renderMs": 103.40254199999981, + "diffMs": 0.1187499999996362, + "writeMs": 0.0005000000001018634, + "frameMs": 154.36079100000006, + "memory": { + "rss": 1188151296, + "heapTotal": 173728768, + "heapUsed": 100014279, + "external": 86241191 + } + }, + { + "id": 45, + "time": 1765732175840, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 55.39983399999983, + "renderMs": 86.6274999999996, + "diffMs": 0.12191599999914615, + "writeMs": 0.0006670000002486631, + "frameMs": 142.17124999999942, + "memory": { + "rss": 1188151296, + "heapTotal": 173728768, + "heapUsed": 100033147, + "external": 86243259 + } + }, + { + "id": 46, + "time": 1765732175993, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 51.402250000000095, + "renderMs": 83.76154200000019, + "diffMs": 0.11345900000014808, + "writeMs": 0.0003749999996216502, + "frameMs": 135.2971660000003, + "memory": { + "rss": 1188151296, + "heapTotal": 101721088, + "heapUsed": 100052063, + "external": 86245327 + } + }, + { + "id": 47, + "time": 1765732176139, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 50.28770800000075, + "renderMs": 81.82583400000021, + "diffMs": 0.11549999999988358, + "writeMs": 0.0009169999993901001, + "frameMs": 132.25120900000002, + "memory": { + "rss": 1188167680, + "heapTotal": 100099072, + "heapUsed": 100070723, + "external": 86247395 + } + }, + { + "id": 48, + "time": 1765732176271, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 55.04320799999914, + "renderMs": 99.06566699999985, + "diffMs": 0.11833299999943847, + "writeMs": 0.0004579999995257822, + "frameMs": 154.2727500000001, + "memory": { + "rss": 1188167680, + "heapTotal": 173777920, + "heapUsed": 100070723, + "external": 86247395 + } + }, + { + "id": 49, + "time": 1765732176426, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 49.85454200000004, + "renderMs": 79.25554100000045, + "diffMs": 0.11129200000050332, + "writeMs": 0.0004170000001977314, + "frameMs": 129.23345900000004, + "memory": { + "rss": 1188167680, + "heapTotal": 173777920, + "heapUsed": 100091743, + "external": 86251391 + } + }, + { + "id": 50, + "time": 1765732176566, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 49.22595900000033, + "renderMs": 82.47187500000018, + "diffMs": 0.12449999999989814, + "writeMs": 0.0007500000001527951, + "frameMs": 131.85716700000012, + "memory": { + "rss": 1188184064, + "heapTotal": 101803008, + "heapUsed": 100110659, + "external": 86253459 + } + }, + { + "id": 51, + "time": 1765732176698, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 25, + "diffCellsChanged": 2, + "diffOps": 4, + "diffCursorMoves": 2, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 49.258082999999715, + "renderMs": 82.46016599999984, + "diffMs": 0.12345800000002782, + "writeMs": 0.0006670000002486631, + "frameMs": 131.88016599999992, + "memory": { + "rss": 1188184064, + "heapTotal": 101803008, + "heapUsed": 100130783, + "external": 86256319 + } + }, + { + "id": 52, + "time": 1765732176841, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 53.22870800000055, + "renderMs": 86.1722920000002, + "diffMs": 0.11787499999991269, + "writeMs": 0.0005420000006779446, + "frameMs": 139.5379159999993, + "memory": { + "rss": 1188184064, + "heapTotal": 100115456, + "heapUsed": 100151019, + "external": 86259515 + } + }, + { + "id": 53, + "time": 1765732176991, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 50.559291999999914, + "renderMs": 82.5821249999999, + "diffMs": 0.11370799999986048, + "writeMs": 0.0008749999997235136, + "frameMs": 133.27445799999987, + "memory": { + "rss": 1188184064, + "heapTotal": 98739200, + "heapUsed": 100172247, + "external": 86263255 + } + }, + { + "id": 54, + "time": 1765732177135, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 51.01158299999952, + "renderMs": 81.53891600000043, + "diffMs": 0.1263330000001588, + "writeMs": 0.0006250000005820766, + "frameMs": 132.69358300000022, + "memory": { + "rss": 1188184064, + "heapTotal": 97330176, + "heapUsed": 100191163, + "external": 86265323 + } + }, + { + "id": 55, + "time": 1765732177268, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 53.64037499999995, + "renderMs": 98.71279200000026, + "diffMs": 0.10558400000081747, + "writeMs": 0.0003750000005311449, + "frameMs": 152.4744579999997, + "memory": { + "rss": 1188282368, + "heapTotal": 173892608, + "heapUsed": 100191163, + "external": 86265323 + } + }, + { + "id": 56, + "time": 1765732177421, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 52.778957999999875, + "renderMs": 80.5679169999994, + "diffMs": 0.10854199999994307, + "writeMs": 0.0006250000005820766, + "frameMs": 133.46987499999977, + "memory": { + "rss": 1188282368, + "heapTotal": 173892608, + "heapUsed": 100210911, + "external": 86267391 + } + }, + { + "id": 57, + "time": 1765732177565, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 50.687417000000096, + "renderMs": 81.49766700000055, + "diffMs": 0.11829199999920093, + "writeMs": 0.0008339999994859681, + "frameMs": 132.32229200000074, + "memory": { + "rss": 1188282368, + "heapTotal": 101393408, + "heapUsed": 100229571, + "external": 86269459 + } + }, + { + "id": 58, + "time": 1765732177698, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 49.727750000000015, + "renderMs": 80.18166700000074, + "diffMs": 0.11170799999854353, + "writeMs": 0.0008330000000569271, + "frameMs": 130.03804199999922, + "memory": { + "rss": 1188282368, + "heapTotal": 101393408, + "heapUsed": 100248487, + "external": 86271527 + } + }, + { + "id": 59, + "time": 1765732177838, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 54.727459000001545, + "renderMs": 91.2042079999992, + "diffMs": 0.11729100000047765, + "writeMs": 0.0005839999994350364, + "frameMs": 146.06925000000047, + "memory": { + "rss": 1188282368, + "heapTotal": 99656704, + "heapUsed": 100267147, + "external": 86273595 + } + }, + { + "id": 60, + "time": 1765732177995, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 51.12287500000093, + "renderMs": 82.84341700000004, + "diffMs": 0.10987500000010186, + "writeMs": 0.00045900000077381264, + "frameMs": 134.09375, + "memory": { + "rss": 1188282368, + "heapTotal": 97477632, + "heapUsed": 100285807, + "external": 86275663 + } + }, + { + "id": 61, + "time": 1765732178140, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 25, + "diffCellsChanged": 2, + "diffOps": 4, + "diffCursorMoves": 2, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 50.33920799999942, + "renderMs": 83.50283399999898, + "diffMs": 0.11029200000120909, + "writeMs": 0.0006670000002486631, + "frameMs": 133.97158300000046, + "memory": { + "rss": 1188315136, + "heapTotal": 95773696, + "heapUsed": 100304467, + "external": 86277731 + } + }, + { + "id": 62, + "time": 1765732178274, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 50.62162499999977, + "renderMs": 81.41904199999954, + "diffMs": 0.11166600000069593, + "writeMs": 0.00033400000029359944, + "frameMs": 132.16912500000035, + "memory": { + "rss": 1188708352, + "heapTotal": 173990912, + "heapUsed": 100304467, + "external": 86277731 + } + }, + { + "id": 63, + "time": 1765732178406, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 51.76637500000106, + "renderMs": 83.24754100000064, + "diffMs": 0.11475000000064028, + "writeMs": 0.0010000000002037268, + "frameMs": 135.14650000000074, + "memory": { + "rss": 1188708352, + "heapTotal": 173990912, + "heapUsed": 100323591, + "external": 86279799 + } + }, + { + "id": 64, + "time": 1765732178552, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 51.37333300000137, + "renderMs": 82.49362500000097, + "diffMs": 0.125292000000627, + "writeMs": 0.0007079999995767139, + "frameMs": 134.01150000000052, + "memory": { + "rss": 1188708352, + "heapTotal": 101016576, + "heapUsed": 100342251, + "external": 86281867 + } + }, + { + "id": 65, + "time": 1765732178687, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 50.04699999999866, + "renderMs": 79.98862499999996, + "diffMs": 0.11470799999915471, + "writeMs": 0.0005839999994350364, + "frameMs": 130.16870800000106, + "memory": { + "rss": 1188708352, + "heapTotal": 101016576, + "heapUsed": 100360911, + "external": 86283935 + } + }, + { + "id": 66, + "time": 1765732178828, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 51.8877080000002, + "renderMs": 83.17000000000007, + "diffMs": 0.11849999999867578, + "writeMs": 0.0006659999999101274, + "frameMs": 135.1939170000005, + "memory": { + "rss": 1188724736, + "heapTotal": 99116032, + "heapUsed": 100379827, + "external": 86286003 + } + }, + { + "id": 67, + "time": 1765732178973, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 48.92712500000016, + "renderMs": 80.96395800000028, + "diffMs": 0.11729200000081619, + "writeMs": 0.0005000000001018634, + "frameMs": 130.0236249999998, + "memory": { + "rss": 1188724736, + "heapTotal": 96396288, + "heapUsed": 100401287, + "external": 86290647 + } + }, + { + "id": 68, + "time": 1765732179123, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 49.37158400000044, + "renderMs": 82.42795800000022, + "diffMs": 0.11104100000011385, + "writeMs": 0.0003750000014406396, + "frameMs": 131.9240000000009, + "memory": { + "rss": 1188659200, + "heapTotal": 94938112, + "heapUsed": 100419947, + "external": 86292715 + } + }, + { + "id": 69, + "time": 1765732179255, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 51.14191700000083, + "renderMs": 84.21125000000029, + "diffMs": 0.11020800000005693, + "writeMs": 0.0005419999997684499, + "frameMs": 135.48099999999977, + "memory": { + "rss": 1189052416, + "heapTotal": 174105600, + "heapUsed": 100419947, + "external": 86292715 + } + }, + { + "id": 70, + "time": 1765732179391, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 51.65241700000115, + "renderMs": 86.80333300000166, + "diffMs": 0.12645799999882001, + "writeMs": 0.0006670000002486631, + "frameMs": 138.6031669999993, + "memory": { + "rss": 1189183488, + "heapTotal": 174105600, + "heapUsed": 100439071, + "external": 86294783 + } + }, + { + "id": 71, + "time": 1765732179540, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 25, + "diffCellsChanged": 2, + "diffOps": 4, + "diffCursorMoves": 2, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 56.43854199999987, + "renderMs": 92.32695799999965, + "diffMs": 0.13400000000001455, + "writeMs": 0.0006669999984296737, + "frameMs": 148.9192920000005, + "memory": { + "rss": 1187889152, + "heapTotal": 101311488, + "heapUsed": 100457731, + "external": 86296851 + } + }, + { + "id": 72, + "time": 1765732179689, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 54.821500000000015, + "renderMs": 83.68662500000028, + "diffMs": 0.1290420000004815, + "writeMs": 0.0006250000005820766, + "frameMs": 138.66120800000135, + "memory": { + "rss": 1187889152, + "heapTotal": 101311488, + "heapUsed": 100476391, + "external": 86298919 + } + }, + { + "id": 73, + "time": 1765732179839, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 55.43733299999985, + "renderMs": 83.09074999999939, + "diffMs": 0.11454200000116543, + "writeMs": 0.0005830000009154901, + "frameMs": 138.66170799999963, + "memory": { + "rss": 1187889152, + "heapTotal": 98821120, + "heapUsed": 100495051, + "external": 86300987 + } + }, + { + "id": 74, + "time": 1765732179988, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 53.34687499999927, + "renderMs": 83.28908300000148, + "diffMs": 0.11700000000018917, + "writeMs": 0.0005419999997684499, + "frameMs": 136.78670799999963, + "memory": { + "rss": 1187741696, + "heapTotal": 95986688, + "heapUsed": 100513967, + "external": 86303055 + } + }, + { + "id": 75, + "time": 1765732180133, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 50.32612500000141, + "renderMs": 82.97712500000125, + "diffMs": 0.13008300000001327, + "writeMs": 0.0005000000001018634, + "frameMs": 133.45158300000003, + "memory": { + "rss": 1187840000, + "heapTotal": 94217216, + "heapUsed": 100532627, + "external": 86305123 + } + }, + { + "id": 76, + "time": 1765732180267, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 54.32841699999881, + "renderMs": 69.50916599999982, + "diffMs": 0.11287500000071304, + "writeMs": 0.0004580000004352769, + "frameMs": 123.96720800000003, + "memory": { + "rss": 1188216832, + "heapTotal": 174220288, + "heapUsed": 100532627, + "external": 86305123 + } + }, + { + "id": 77, + "time": 1765732180391, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 50.038542000000234, + "renderMs": 82.40320799999972, + "diffMs": 0.10587499999928696, + "writeMs": 0.0003749999996216502, + "frameMs": 132.5625, + "memory": { + "rss": 1188560896, + "heapTotal": 174220288, + "heapUsed": 100551495, + "external": 86307191 + } + }, + { + "id": 78, + "time": 1765732180534, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 54.59379199999967, + "renderMs": 88.94570799999929, + "diffMs": 0.13850000000093132, + "writeMs": 0.0005419999997684499, + "frameMs": 143.69612499999857, + "memory": { + "rss": 1188560896, + "heapTotal": 101262336, + "heapUsed": 100570411, + "external": 86309259 + } + }, + { + "id": 79, + "time": 1765732180679, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 51.19854199999827, + "renderMs": 86.1787919999988, + "diffMs": 0.10925000000133878, + "writeMs": 0.0007499999992433004, + "frameMs": 137.5067910000016, + "memory": { + "rss": 1188577280, + "heapTotal": 101262336, + "heapUsed": 100590471, + "external": 86312503 + } + }, + { + "id": 80, + "time": 1765732180827, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 52.719458999999915, + "renderMs": 82.30058300000019, + "diffMs": 0.11724999999933061, + "writeMs": 0.0005419999997684499, + "frameMs": 135.15712499999972, + "memory": { + "rss": 1188577280, + "heapTotal": 98296832, + "heapUsed": 100609131, + "external": 86314571 + } + }, + { + "id": 81, + "time": 1765732180972, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 25, + "diffCellsChanged": 2, + "diffOps": 4, + "diffCursorMoves": 2, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 49.65412500000093, + "renderMs": 82.59179200000108, + "diffMs": 0.10816599999998289, + "writeMs": 0.0005000000001018634, + "frameMs": 132.37258400000064, + "memory": { + "rss": 1188577280, + "heapTotal": 95446016, + "heapUsed": 100627791, + "external": 86316639 + } + }, + { + "id": 82, + "time": 1765732181109, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 49.09074999999939, + "renderMs": 83.88212500000009, + "diffMs": 0.11049999999886495, + "writeMs": 0.0005000000001018634, + "frameMs": 133.09816699999828, + "memory": { + "rss": 1188577280, + "heapTotal": 94331904, + "heapUsed": 100646707, + "external": 86318707 + } + }, + { + "id": 83, + "time": 1765732181242, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 50.92079100000046, + "renderMs": 69.44599999999991, + "diffMs": 0.10974999999962165, + "writeMs": 0.0005840000012540258, + "frameMs": 120.4942919999994, + "memory": { + "rss": 1188626432, + "heapTotal": 174318592, + "heapUsed": 100646707, + "external": 86318707 + } + }, + { + "id": 84, + "time": 1765732181364, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 50.715291000000434, + "renderMs": 84.82345799999894, + "diffMs": 0.12570899999991525, + "writeMs": 0.0007919999989098869, + "frameMs": 135.68370800000048, + "memory": { + "rss": 1188691968, + "heapTotal": 174318592, + "heapUsed": 100667695, + "external": 86322671 + } + }, + { + "id": 85, + "time": 1765732181510, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 54.14324999999917, + "renderMs": 87.19416599999931, + "diffMs": 0.11729099999865866, + "writeMs": 0.0005000000001018634, + "frameMs": 141.47420799999963, + "memory": { + "rss": 1188691968, + "heapTotal": 101327872, + "heapUsed": 100686355, + "external": 86324739 + } + }, + { + "id": 86, + "time": 1765732181662, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 52.123083000000406, + "renderMs": 84.75170900000012, + "diffMs": 0.13116699999955017, + "writeMs": 0.0008339999985764734, + "frameMs": 137.02770899999996, + "memory": { + "rss": 1188691968, + "heapTotal": 98509824, + "heapUsed": 100705271, + "external": 86326807 + } + }, + { + "id": 87, + "time": 1765732181800, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 52.15495899999951, + "renderMs": 82.46429200000057, + "diffMs": 0.11404100000072503, + "writeMs": 0.0007920000007288763, + "frameMs": 134.75283299999865, + "memory": { + "rss": 1188823040, + "heapTotal": 174384128, + "heapUsed": 100705271, + "external": 86326807 + } + }, + { + "id": 88, + "time": 1765732181935, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 51.238624999999956, + "renderMs": 85.37562499999876, + "diffMs": 0.13999999999941792, + "writeMs": 0.0007919999989098869, + "frameMs": 136.7736249999998, + "memory": { + "rss": 1188823040, + "heapTotal": 174384128, + "heapUsed": 100724139, + "external": 86328875 + } + }, + { + "id": 89, + "time": 1765732182082, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 50.23395799999889, + "renderMs": 85.55170900000121, + "diffMs": 0.11033300000053714, + "writeMs": 0.0007919999989098869, + "frameMs": 135.9144580000011, + "memory": { + "rss": 1188823040, + "heapTotal": 102228992, + "heapUsed": 100742799, + "external": 86330943 + } + }, + { + "id": 90, + "time": 1765732182229, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 53.77862500000083, + "renderMs": 86.95354200000111, + "diffMs": 0.13220899999942048, + "writeMs": 0.0010000000002037268, + "frameMs": 140.88508399999955, + "memory": { + "rss": 1188823040, + "heapTotal": 100443136, + "heapUsed": 100761715, + "external": 86333011 + } + }, + { + "id": 91, + "time": 1765732182370, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 25, + "diffCellsChanged": 2, + "diffOps": 4, + "diffCursorMoves": 2, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 52.13337499999943, + "renderMs": 102.58358300000145, + "diffMs": 0.11533299999973678, + "writeMs": 0.0005000000001018634, + "frameMs": 154.8517499999998, + "memory": { + "rss": 1189249024, + "heapTotal": 174433280, + "heapUsed": 100761715, + "external": 86333011 + } + }, + { + "id": 92, + "time": 1765732182526, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 58.771334000000934, + "renderMs": 83.51912500000071, + "diffMs": 0.11712500000066939, + "writeMs": 0.000709000001734239, + "frameMs": 142.4265830000004, + "memory": { + "rss": 1189265408, + "heapTotal": 174433280, + "heapUsed": 100780583, + "external": 86335079 + } + }, + { + "id": 93, + "time": 1765732182668, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 54.66437500000029, + "renderMs": 102.07216700000026, + "diffMs": 0.10770899999988615, + "writeMs": 0.0003329999999550637, + "frameMs": 156.85974999999962, + "memory": { + "rss": 1191002112, + "heapTotal": 174449664, + "heapUsed": 100780583, + "external": 86335079 + } + }, + { + "id": 94, + "time": 1765732182825, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 54.17620799999895, + "renderMs": 84.6668750000008, + "diffMs": 0.11495800000011513, + "writeMs": 0.0004580000004352769, + "frameMs": 138.97420799999963, + "memory": { + "rss": 1191002112, + "heapTotal": 174449664, + "heapUsed": 100799707, + "external": 86337147 + } + }, + { + "id": 95, + "time": 1765732182975, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 52.78204199999891, + "renderMs": 82.41208299999926, + "diffMs": 0.12695799999892188, + "writeMs": 0.0007500000010622898, + "frameMs": 135.34000000000015, + "memory": { + "rss": 1191002112, + "heapTotal": 103064576, + "heapUsed": 100818367, + "external": 86339215 + } + }, + { + "id": 96, + "time": 1765732183121, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 49.93804199999977, + "renderMs": 82.85033300000032, + "diffMs": 0.1320000000014261, + "writeMs": 0.0006250000005820766, + "frameMs": 132.93854100000135, + "memory": { + "rss": 1191002112, + "heapTotal": 101606400, + "heapUsed": 100837627, + "external": 86341659 + } + }, + { + "id": 97, + "time": 1765732183254, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 56.965791000000536, + "renderMs": 111.77924999999959, + "diffMs": 0.11804200000005949, + "writeMs": 0.0006249999987630872, + "frameMs": 168.88200000000143, + "memory": { + "rss": 1191002112, + "heapTotal": 174498816, + "heapUsed": 100837627, + "external": 86341659 + } + }, + { + "id": 98, + "time": 1765732183423, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 55.478791999999885, + "renderMs": 81.90512500000114, + "diffMs": 0.11516699999992852, + "writeMs": 0.021833999999216758, + "frameMs": 137.54112499999974, + "memory": { + "rss": 1191002112, + "heapTotal": 174515200, + "heapUsed": 100856751, + "external": 86343727 + } + }, + { + "id": 99, + "time": 1765732183572, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 51.837625000000116, + "renderMs": 86.90591700000004, + "diffMs": 0.10687499999949068, + "writeMs": 0.010374999999839929, + "frameMs": 138.878917, + "memory": { + "rss": 1191002112, + "heapTotal": 102982656, + "heapUsed": 100875635, + "external": 86345795 + } + }, + { + "id": 100, + "time": 1765732183711, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 53.75604199999907, + "renderMs": 84.86454200000117, + "diffMs": 0.11645900000075926, + "writeMs": 0.0007079999995767139, + "frameMs": 138.77516599999944, + "memory": { + "rss": 1191002112, + "heapTotal": 102982656, + "heapUsed": 100894295, + "external": 86347863 + } + }, + { + "id": 101, + "time": 1765732183860, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 33, + "diffCellsChanged": 3, + "diffOps": 5, + "diffCursorMoves": 3, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 50.78929199999948, + "renderMs": 83.03050000000076, + "diffMs": 0.12429200000042329, + "writeMs": 0.00370900000052643, + "frameMs": 133.96999999999935, + "memory": { + "rss": 1191018496, + "heapTotal": 101426176, + "heapUsed": 100914963, + "external": 86351267 + } + }, + { + "id": 102, + "time": 1765732184005, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 52.20666700000038, + "renderMs": 85.3427499999998, + "diffMs": 0.10916699999870616, + "writeMs": 0.00008300000081362668, + "frameMs": 137.67475000000013, + "memory": { + "rss": 1191018496, + "heapTotal": 100148224, + "heapUsed": 100947938, + "external": 86363794 + } + }, + { + "id": 103, + "time": 1765732184153, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 51.97070900000108, + "renderMs": 86.01579200000015, + "diffMs": 0.11587499999950523, + "writeMs": 0.00008300000081362668, + "frameMs": 138.1187919999993, + "memory": { + "rss": 1191018496, + "heapTotal": 98870272, + "heapUsed": 100966927, + "external": 86365967 + } + }, + { + "id": 104, + "time": 1765732184292, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 51.891333999999915, + "renderMs": 103.24204199999986, + "diffMs": 0.1172500000011496, + "writeMs": 0.00020899999981338624, + "frameMs": 155.26745799999844, + "memory": { + "rss": 1191018496, + "heapTotal": 174629888, + "heapUsed": 100966927, + "external": 86365967 + } + }, + { + "id": 105, + "time": 1765732184447, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 50.039292000001296, + "renderMs": 87.29545899999903, + "diffMs": 0.12508300000081363, + "writeMs": 0.00008300000081362668, + "frameMs": 137.47654200000034, + "memory": { + "rss": 1191018496, + "heapTotal": 174629888, + "heapUsed": 100985796, + "external": 86368036 + } + }, + { + "id": 106, + "time": 1765732184596, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 50.45079200000146, + "renderMs": 84.17354199999863, + "diffMs": 0.11720799999966403, + "writeMs": 0.00020799999947485048, + "frameMs": 134.76024999999936, + "memory": { + "rss": 1191018496, + "heapTotal": 102671360, + "heapUsed": 101004713, + "external": 86370105 + } + }, + { + "id": 107, + "time": 1765732184731, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 50.8030830000007, + "renderMs": 83.83666600000106, + "diffMs": 0.11587499999950523, + "writeMs": 0.00016700000014679972, + "frameMs": 134.77145799999926, + "memory": { + "rss": 1191018496, + "heapTotal": 102671360, + "heapUsed": 101023374, + "external": 86372174 + } + }, + { + "id": 108, + "time": 1765732184876, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 50.79845899999964, + "renderMs": 85.05791599999975, + "diffMs": 0.11462500000016007, + "writeMs": 0.00008400000115216244, + "frameMs": 135.9880830000002, + "memory": { + "rss": 1191018496, + "heapTotal": 100967424, + "heapUsed": 101042035, + "external": 86374243 + } + }, + { + "id": 109, + "time": 1765732185023, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 49.56791700000031, + "renderMs": 84.79420800000116, + "diffMs": 0.10687499999949068, + "writeMs": 0.00004099999932805076, + "frameMs": 134.4819580000003, + "memory": { + "rss": 1191018496, + "heapTotal": 99083264, + "heapUsed": 101060696, + "external": 86376312 + } + }, + { + "id": 110, + "time": 1765732185168, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 50.51237499999843, + "renderMs": 85.29399999999987, + "diffMs": 0.1274169999996957, + "writeMs": 0.0001249999986612238, + "frameMs": 135.94933400000082, + "memory": { + "rss": 1191018496, + "heapTotal": 97330176, + "heapUsed": 101079613, + "external": 86378381 + } + }, + { + "id": 111, + "time": 1765732185304, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 25, + "diffCellsChanged": 2, + "diffOps": 4, + "diffCursorMoves": 2, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 56.18616699999984, + "renderMs": 87.78141700000015, + "diffMs": 0.1258749999997235, + "writeMs": 0.00016700000014679972, + "frameMs": 144.1091660000002, + "memory": { + "rss": 1191018496, + "heapTotal": 174728192, + "heapUsed": 101079613, + "external": 86378381 + } + }, + { + "id": 112, + "time": 1765732185448, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 57.97862499999974, + "renderMs": 82.41450000000077, + "diffMs": 0.11995799999931478, + "writeMs": 0.00020899999981338624, + "frameMs": 140.53016600000046, + "memory": { + "rss": 1191018496, + "heapTotal": 174728192, + "heapUsed": 101100258, + "external": 86380450 + } + }, + { + "id": 113, + "time": 1765732185600, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 50.41150000000016, + "renderMs": 82.6567500000001, + "diffMs": 0.12754099999983737, + "writeMs": 0.00020799999947485048, + "frameMs": 133.21204200000102, + "memory": { + "rss": 1191018496, + "heapTotal": 102048768, + "heapUsed": 101118919, + "external": 86382519 + } + }, + { + "id": 114, + "time": 1765732185733, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 49.73912499999824, + "renderMs": 82.5307499999999, + "diffMs": 0.14595899999949324, + "writeMs": 0.0001249999986612238, + "frameMs": 132.43625000000065, + "memory": { + "rss": 1191018496, + "heapTotal": 102048768, + "heapUsed": 101137836, + "external": 86384588 + } + }, + { + "id": 115, + "time": 1765732185876, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 52.007958999998664, + "renderMs": 84.0336669999997, + "diffMs": 0.11541700000088895, + "writeMs": 0.00004199999966658652, + "frameMs": 136.17091600000094, + "memory": { + "rss": 1191018496, + "heapTotal": 100230144, + "heapUsed": 101156497, + "external": 86386657 + } + }, + { + "id": 116, + "time": 1765732186023, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 50.65220800000316, + "renderMs": 83.21479100000215, + "diffMs": 0.13300000000162981, + "writeMs": 0.00020799999765586108, + "frameMs": 134.01458399999683, + "memory": { + "rss": 1191018496, + "heapTotal": 97592320, + "heapUsed": 101175158, + "external": 86388726 + } + }, + { + "id": 117, + "time": 1765732186167, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 53.92058399999951, + "renderMs": 83.1294999999991, + "diffMs": 0.10745799999858718, + "writeMs": 0.00008399999933317304, + "frameMs": 137.17304100000183, + "memory": { + "rss": 1191018496, + "heapTotal": 95822848, + "heapUsed": 101193819, + "external": 86390795 + } + }, + { + "id": 118, + "time": 1765732186305, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 53.09783400000015, + "renderMs": 78.32204099999944, + "diffMs": 0.11541699999725097, + "writeMs": 0.00008300000263261609, + "frameMs": 131.5511669999978, + "memory": { + "rss": 1191018496, + "heapTotal": 174859264, + "heapUsed": 101193819, + "external": 86390795 + } + }, + { + "id": 119, + "time": 1765732186437, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 51.83533299999908, + "renderMs": 86.52174999999988, + "diffMs": 0.12879200000315905, + "writeMs": 0.00008299999899463728, + "frameMs": 138.50050000000192, + "memory": { + "rss": 1191018496, + "heapTotal": 174859264, + "heapUsed": 101215400, + "external": 86395096 + } + }, + { + "id": 120, + "time": 1765732186586, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 56.14849999999933, + "renderMs": 89.28754199999821, + "diffMs": 0.14045900000201073, + "writeMs": 0.00008399999933317304, + "frameMs": 145.59354099999837, + "memory": { + "rss": 1190871040, + "heapTotal": 102097920, + "heapUsed": 101234061, + "external": 86397165 + } + } + ], + "summary": { + "frameCount": 120, + "frameMs": { + "p50": 135.94933400000082, + "p95": 154.36079100000006, + "p99": 162.52229199999988, + "max": 168.88200000000143 + }, + "totals": { + "layoutMs": 6211.829093000002, + "renderMs": 10292.19279000001, + "diffMs": 14.636541000000534, + "writeMs": 0.12142599999759796, + "frameMs": 16521.749786 + } + } +} \ No newline at end of file diff --git a/profiles/stress-1765733920188.json b/profiles/stress-1765733920188.json new file mode 100644 index 0000000..d2c372b --- /dev/null +++ b/profiles/stress-1765733920188.json @@ -0,0 +1,3023 @@ +{ + "version": 1, + "startedAt": "2025-12-14T17:38:40.191Z", + "endedAt": "2025-12-14T17:38:48.905Z", + "frames": [ + { + "id": 1, + "time": 1765733920198, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 2584, + "diffCellsChanged": 330, + "diffOps": 333, + "diffCursorMoves": 330, + "diffStyleChanges": 2, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 54.271291000000005, + "renderMs": 72.660125, + "diffMs": 0.40237500000000637, + "writeMs": 0.009042000000022199, + "frameMs": 127.667292, + "memory": { + "rss": 669188096, + "heapTotal": 81826816, + "heapUsed": 37022117, + "external": 85075194 + } + }, + { + "id": 2, + "time": 1765733920327, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 78.81787499999999, + "diffMs": 0.15408300000001418, + "writeMs": 0.002666000000004942, + "frameMs": 79, + "memory": { + "rss": 679952384, + "heapTotal": 87892992, + "heapUsed": 97855049, + "external": 85260793 + } + }, + { + "id": 3, + "time": 1765733920407, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 69.50799999999998, + "diffMs": 0.15054100000003245, + "writeMs": 0.002207999999995991, + "frameMs": 69.67908299999996, + "memory": { + "rss": 679985152, + "heapTotal": 87892992, + "heapUsed": 97892907, + "external": 85293819 + } + }, + { + "id": 4, + "time": 1765733920476, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 67.08908300000002, + "diffMs": 0.09133300000002009, + "writeMs": 0.0005409999999983484, + "frameMs": 67.19512499999996, + "memory": { + "rss": 1120108544, + "heapTotal": 136881152, + "heapUsed": 97892907, + "external": 85293819 + } + }, + { + "id": 5, + "time": 1765733920544, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 67.195625, + "diffMs": 0.09454199999998991, + "writeMs": 0.0006250000000136424, + "frameMs": 67.30879099999999, + "memory": { + "rss": 1120337920, + "heapTotal": 136881152, + "heapUsed": 97919889, + "external": 85319617 + } + }, + { + "id": 6, + "time": 1765733920612, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 69.48399999999998, + "diffMs": 0.10591699999997672, + "writeMs": 0.0011669999999526226, + "frameMs": 69.60608399999995, + "memory": { + "rss": 1120665600, + "heapTotal": 136881152, + "heapUsed": 97920481, + "external": 85319649 + } + }, + { + "id": 7, + "time": 1765733920682, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 69.469875, + "diffMs": 0.12758400000006986, + "writeMs": 0.0007500000000391083, + "frameMs": 69.61624999999998, + "memory": { + "rss": 1120681984, + "heapTotal": 136881152, + "heapUsed": 97931325, + "external": 85329885 + } + }, + { + "id": 8, + "time": 1765733920752, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 71.66958299999999, + "diffMs": 0.1478749999999991, + "writeMs": 0.00037500000007639755, + "frameMs": 71.83179200000006, + "memory": { + "rss": 1120681984, + "heapTotal": 136881152, + "heapUsed": 97931325, + "external": 85329885 + } + }, + { + "id": 9, + "time": 1765733920824, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 71.13049999999998, + "diffMs": 0.14629100000001927, + "writeMs": 0.0007500000000391083, + "frameMs": 71.29375000000005, + "memory": { + "rss": 1120681984, + "heapTotal": 136881152, + "heapUsed": 97934636, + "external": 85332284 + } + }, + { + "id": 10, + "time": 1765733920895, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 70.00158299999998, + "diffMs": 0.12704099999996288, + "writeMs": 0.0009160000000747459, + "frameMs": 70.14529199999993, + "memory": { + "rss": 1120681984, + "heapTotal": 136881152, + "heapUsed": 97935228, + "external": 85332316 + } + }, + { + "id": 11, + "time": 1765733920966, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 25, + "diffCellsChanged": 2, + "diffOps": 4, + "diffCursorMoves": 2, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 70.47133299999996, + "diffMs": 0.11354100000005474, + "writeMs": 0.0008749999999508873, + "frameMs": 70.60941600000001, + "memory": { + "rss": 1120681984, + "heapTotal": 136881152, + "heapUsed": 97935724, + "external": 85332348 + } + }, + { + "id": 12, + "time": 1765733921037, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 72.3687920000001, + "diffMs": 0.10695899999996072, + "writeMs": 0.0006670000000212895, + "frameMs": 72.506125, + "memory": { + "rss": 1120714752, + "heapTotal": 136881152, + "heapUsed": 97935724, + "external": 85332348 + } + }, + { + "id": 13, + "time": 1765733921110, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 69.19716600000004, + "diffMs": 0.13095899999996163, + "writeMs": 0.00029099999994741665, + "frameMs": 69.34779199999991, + "memory": { + "rss": 1120714752, + "heapTotal": 136881152, + "heapUsed": 97936557, + "external": 85332381 + } + }, + { + "id": 14, + "time": 1765733921180, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 68.97241700000006, + "diffMs": 0.11349999999993088, + "writeMs": 0.0002910000000611035, + "frameMs": 69.10933299999988, + "memory": { + "rss": 1120714752, + "heapTotal": 136881152, + "heapUsed": 97937286, + "external": 85332502 + } + }, + { + "id": 15, + "time": 1765733921249, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 69.06179199999997, + "diffMs": 0.13408299999991868, + "writeMs": 0.0002910000000611035, + "frameMs": 69.23695800000019, + "memory": { + "rss": 1120714752, + "heapTotal": 136881152, + "heapUsed": 97937623, + "external": 85332535 + } + }, + { + "id": 16, + "time": 1765733921319, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 69.09308299999998, + "diffMs": 0.1118340000000444, + "writeMs": 0.00041699999997035775, + "frameMs": 69.26312500000017, + "memory": { + "rss": 1120714752, + "heapTotal": 136881152, + "heapUsed": 97937960, + "external": 85332568 + } + }, + { + "id": 17, + "time": 1765733921388, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 69.54129200000011, + "diffMs": 0.11712499999998727, + "writeMs": 0.00033400000006622577, + "frameMs": 69.68358400000011, + "memory": { + "rss": 1120714752, + "heapTotal": 136881152, + "heapUsed": 97938297, + "external": 85332601 + } + }, + { + "id": 18, + "time": 1765733921458, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 67.80116599999997, + "diffMs": 0.12358300000005329, + "writeMs": 0.0002500000000509317, + "frameMs": 67.9414999999999, + "memory": { + "rss": 1120714752, + "heapTotal": 136881152, + "heapUsed": 97938297, + "external": 85332601 + } + }, + { + "id": 19, + "time": 1765733921526, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 69.498875, + "diffMs": 0.11337499999990541, + "writeMs": 0.0002080000001569715, + "frameMs": 69.62658299999998, + "memory": { + "rss": 1120714752, + "heapTotal": 136881152, + "heapUsed": 97939290, + "external": 85332634 + } + }, + { + "id": 20, + "time": 1765733921596, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 69.67025000000012, + "diffMs": 0.12183299999992414, + "writeMs": 0.0002500000000509317, + "frameMs": 69.80666700000006, + "memory": { + "rss": 1120714752, + "heapTotal": 136881152, + "heapUsed": 97939723, + "external": 85332667 + } + }, + { + "id": 21, + "time": 1765733921667, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 25, + "diffCellsChanged": 2, + "diffOps": 4, + "diffCursorMoves": 2, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 69.36691700000006, + "diffMs": 0.1198749999998654, + "writeMs": 0.00033400000006622577, + "frameMs": 69.49816699999997, + "memory": { + "rss": 1120714752, + "heapTotal": 136881152, + "heapUsed": 97940412, + "external": 85332700 + } + }, + { + "id": 22, + "time": 1765733921736, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 67.45762500000001, + "diffMs": 0.11062500000002728, + "writeMs": 0.0002909999998337298, + "frameMs": 67.58400000000006, + "memory": { + "rss": 1120714752, + "heapTotal": 136881152, + "heapUsed": 97940412, + "external": 85332700 + } + }, + { + "id": 23, + "time": 1765733921804, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 69.70658400000002, + "diffMs": 0.12929099999996652, + "writeMs": 0.0003749999998490239, + "frameMs": 69.85037500000021, + "memory": { + "rss": 1120714752, + "heapTotal": 136881152, + "heapUsed": 97941213, + "external": 85332733 + } + }, + { + "id": 24, + "time": 1765733921874, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 69.23329199999989, + "diffMs": 0.11579099999994469, + "writeMs": 0.0003339999998388521, + "frameMs": 69.3627919999999, + "memory": { + "rss": 1120714752, + "heapTotal": 136881152, + "heapUsed": 97941550, + "external": 85332766 + } + }, + { + "id": 25, + "time": 1765733921944, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 68.91225000000009, + "diffMs": 0.1219579999999496, + "writeMs": 0.00016699999991942605, + "frameMs": 69.046875, + "memory": { + "rss": 1120714752, + "heapTotal": 136881152, + "heapUsed": 97941887, + "external": 85332799 + } + }, + { + "id": 26, + "time": 1765733922013, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 69.56475, + "diffMs": 0.11904200000003584, + "writeMs": 0.00033400000006622577, + "frameMs": 69.69804099999988, + "memory": { + "rss": 1120714752, + "heapTotal": 136897536, + "heapUsed": 97941887, + "external": 85332799 + } + }, + { + "id": 27, + "time": 1765733922084, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 69.41020800000001, + "diffMs": 0.1058339999999589, + "writeMs": 0.0003329999999550637, + "frameMs": 69.52983299999983, + "memory": { + "rss": 1120714752, + "heapTotal": 136897536, + "heapUsed": 97943400, + "external": 85333320 + } + }, + { + "id": 28, + "time": 1765733922153, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 69.6111249999999, + "diffMs": 0.12312500000007276, + "writeMs": 0.0003339999998388521, + "frameMs": 69.74566699999991, + "memory": { + "rss": 1120714752, + "heapTotal": 136897536, + "heapUsed": 97943737, + "external": 85333353 + } + }, + { + "id": 29, + "time": 1765733922224, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 72.29958299999998, + "diffMs": 0.13699999999971624, + "writeMs": 0.0003749999996216502, + "frameMs": 72.45391700000027, + "memory": { + "rss": 1120714752, + "heapTotal": 136897536, + "heapUsed": 97944210, + "external": 85333474 + } + }, + { + "id": 30, + "time": 1765733922296, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 72.70749999999998, + "diffMs": 0.12808300000006057, + "writeMs": 0.00037500000007639755, + "frameMs": 72.84904200000028, + "memory": { + "rss": 1120714752, + "heapTotal": 136897536, + "heapUsed": 97944210, + "external": 85333474 + } + }, + { + "id": 31, + "time": 1765733922369, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 25, + "diffCellsChanged": 2, + "diffOps": 4, + "diffCursorMoves": 2, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 70.03950000000032, + "diffMs": 0.1230000000000473, + "writeMs": 0.00037500000007639755, + "frameMs": 70.1761660000002, + "memory": { + "rss": 1120714752, + "heapTotal": 136897536, + "heapUsed": 97945011, + "external": 85333507 + } + }, + { + "id": 32, + "time": 1765733922440, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 71.00808299999971, + "diffMs": 0.11895899999990434, + "writeMs": 0.0002500000000509317, + "frameMs": 71.13962500000025, + "memory": { + "rss": 1120714752, + "heapTotal": 136897536, + "heapUsed": 97945348, + "external": 85333540 + } + }, + { + "id": 33, + "time": 1765733922512, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 70.46216699999968, + "diffMs": 0.1119170000001759, + "writeMs": 0.00041599999985919567, + "frameMs": 70.59100000000035, + "memory": { + "rss": 1120714752, + "heapTotal": 136897536, + "heapUsed": 97946117, + "external": 85333573 + } + }, + { + "id": 34, + "time": 1765733922582, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 70.4882090000001, + "diffMs": 0.11329200000000128, + "writeMs": 0.0009579999996276456, + "frameMs": 70.62608399999999, + "memory": { + "rss": 1120747520, + "heapTotal": 136913920, + "heapUsed": 97946117, + "external": 85333573 + } + }, + { + "id": 35, + "time": 1765733922653, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 70.07045799999969, + "diffMs": 0.11295799999970768, + "writeMs": 0.02420799999981682, + "frameMs": 70.23170899999968, + "memory": { + "rss": 1120796672, + "heapTotal": 136913920, + "heapUsed": 97946918, + "external": 85333606 + } + }, + { + "id": 36, + "time": 1765733922724, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 69.74675000000025, + "diffMs": 0.12191699999993943, + "writeMs": 0.00045799999998052954, + "frameMs": 69.907917, + "memory": { + "rss": 1120796672, + "heapTotal": 136913920, + "heapUsed": 97948223, + "external": 85333999 + } + }, + { + "id": 37, + "time": 1765733922794, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 69.2060419999998, + "diffMs": 0.11749999999983629, + "writeMs": 0.00045799999998052954, + "frameMs": 69.33916700000009, + "memory": { + "rss": 1120796672, + "heapTotal": 136913920, + "heapUsed": 97949424, + "external": 85334032 + } + }, + { + "id": 38, + "time": 1765733922864, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 78.13075000000026, + "diffMs": 0.11283300000013696, + "writeMs": 0.0007089999999152496, + "frameMs": 78.26537499999995, + "memory": { + "rss": 1120796672, + "heapTotal": 136913920, + "heapUsed": 97949424, + "external": 85334032 + } + }, + { + "id": 39, + "time": 1765733922942, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 69.55433300000004, + "diffMs": 0.11774999999988722, + "writeMs": 0.0005420000002231973, + "frameMs": 69.68712500000038, + "memory": { + "rss": 1120796672, + "heapTotal": 136913920, + "heapUsed": 97950321, + "external": 85334065 + } + }, + { + "id": 40, + "time": 1765733923012, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 68.921292, + "diffMs": 0.10562500000014552, + "writeMs": 0.0003749999996216502, + "frameMs": 69.04149999999981, + "memory": { + "rss": 1120796672, + "heapTotal": 136913920, + "heapUsed": 97950658, + "external": 85334098 + } + }, + { + "id": 41, + "time": 1765733923082, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 25, + "diffCellsChanged": 2, + "diffOps": 4, + "diffCursorMoves": 2, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 68.68566699999974, + "diffMs": 0.11133300000028612, + "writeMs": 0.0005000000001018634, + "frameMs": 68.81395799999973, + "memory": { + "rss": 1120796672, + "heapTotal": 136913920, + "heapUsed": 97950995, + "external": 85334131 + } + }, + { + "id": 42, + "time": 1765733923151, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 69.57729199999994, + "diffMs": 0.11216700000022684, + "writeMs": 0.00041599999985919567, + "frameMs": 69.70241600000008, + "memory": { + "rss": 1120796672, + "heapTotal": 136913920, + "heapUsed": 97950995, + "external": 85334131 + } + }, + { + "id": 43, + "time": 1765733923221, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 69.59212499999967, + "diffMs": 0.11787499999991269, + "writeMs": 0.00037500000007639755, + "frameMs": 69.72329199999967, + "memory": { + "rss": 1120796672, + "heapTotal": 136913920, + "heapUsed": 97951813, + "external": 85334165 + } + }, + { + "id": 44, + "time": 1765733923291, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 68.94875000000002, + "diffMs": 0.11591700000008132, + "writeMs": 0.0005409999998846615, + "frameMs": 69.0783749999996, + "memory": { + "rss": 1120796672, + "heapTotal": 136913920, + "heapUsed": 97951813, + "external": 85334165 + } + }, + { + "id": 45, + "time": 1765733923360, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 69.20912499999986, + "diffMs": 0.10883300000023155, + "writeMs": 0.00020799999992959783, + "frameMs": 69.33137499999975, + "memory": { + "rss": 1120796672, + "heapTotal": 136913920, + "heapUsed": 97952392, + "external": 85334200 + } + }, + { + "id": 46, + "time": 1765733923430, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 69.3921250000003, + "diffMs": 0.10895800000025702, + "writeMs": 0.0008339999999407155, + "frameMs": 69.51433300000008, + "memory": { + "rss": 1120796672, + "heapTotal": 136913920, + "heapUsed": 97953002, + "external": 85334234 + } + }, + { + "id": 47, + "time": 1765733923500, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 70.14100000000008, + "diffMs": 0.11024999999972351, + "writeMs": 0.0002500000000509317, + "frameMs": 70.26283300000023, + "memory": { + "rss": 1120796672, + "heapTotal": 136913920, + "heapUsed": 97953356, + "external": 85334268 + } + }, + { + "id": 48, + "time": 1765733923570, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 68.91258300000027, + "diffMs": 0.10816600000043763, + "writeMs": 0.007916999999906693, + "frameMs": 69.0851660000003, + "memory": { + "rss": 1120813056, + "heapTotal": 136913920, + "heapUsed": 97953710, + "external": 85334302 + } + }, + { + "id": 49, + "time": 1765733923640, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 69.38470899999993, + "diffMs": 0.12170800000012605, + "writeMs": 0.0019160000001647859, + "frameMs": 69.52195799999981, + "memory": { + "rss": 1120813056, + "heapTotal": 136913920, + "heapUsed": 97953710, + "external": 85334302 + } + }, + { + "id": 50, + "time": 1765733923709, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 75.32229099999995, + "diffMs": 0.13237500000013824, + "writeMs": 0.0006669999997939158, + "frameMs": 75.48483299999998, + "memory": { + "rss": 1120813056, + "heapTotal": 136913920, + "heapUsed": 97959233, + "external": 85338577 + } + }, + { + "id": 51, + "time": 1765733923785, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 25, + "diffCellsChanged": 2, + "diffOps": 4, + "diffCursorMoves": 2, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 71.34912500000019, + "diffMs": 0.12533299999995506, + "writeMs": 0.0005839999998897838, + "frameMs": 71.51216599999998, + "memory": { + "rss": 1120813056, + "heapTotal": 136913920, + "heapUsed": 97961051, + "external": 85339403 + } + }, + { + "id": 52, + "time": 1765733923857, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 70.9816249999999, + "diffMs": 0.10779100000036124, + "writeMs": 0.0004170000001977314, + "frameMs": 71.10104100000035, + "memory": { + "rss": 1120813056, + "heapTotal": 136913920, + "heapUsed": 97962597, + "external": 85340181 + } + }, + { + "id": 53, + "time": 1765733923929, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 69.150083, + "diffMs": 0.11504199999990306, + "writeMs": 0.0005420000002231973, + "frameMs": 69.27895799999988, + "memory": { + "rss": 1120813056, + "heapTotal": 136913920, + "heapUsed": 97962597, + "external": 85340181 + } + }, + { + "id": 54, + "time": 1765733923998, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 70.532917, + "diffMs": 0.11016699999981938, + "writeMs": 0.0003329999999550637, + "frameMs": 70.65570800000023, + "memory": { + "rss": 1120813056, + "heapTotal": 136913920, + "heapUsed": 97964944, + "external": 85341280 + } + }, + { + "id": 55, + "time": 1765733924069, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 71.34574999999995, + "diffMs": 0.12387500000022555, + "writeMs": 0.0005000000001018634, + "frameMs": 71.48366699999997, + "memory": { + "rss": 1120813056, + "heapTotal": 136913920, + "heapUsed": 97966178, + "external": 85341314 + } + }, + { + "id": 56, + "time": 1765733924141, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 71.19074999999975, + "diffMs": 0.1125000000001819, + "writeMs": 0.0002500000000509317, + "frameMs": 71.3144169999996, + "memory": { + "rss": 1120813056, + "heapTotal": 136913920, + "heapUsed": 97966532, + "external": 85341348 + } + }, + { + "id": 57, + "time": 1765733924213, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 71.411791, + "diffMs": 0.12874999999985448, + "writeMs": 0.0005419999997684499, + "frameMs": 71.55633400000033, + "memory": { + "rss": 1120813056, + "heapTotal": 136913920, + "heapUsed": 97968333, + "external": 85341389 + } + }, + { + "id": 58, + "time": 1765733924285, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 71.34975000000031, + "diffMs": 0.1172500000002401, + "writeMs": 0.00029100000028847717, + "frameMs": 71.48083399999996, + "memory": { + "rss": 1120813056, + "heapTotal": 136913920, + "heapUsed": 97968654, + "external": 85341406 + } + }, + { + "id": 59, + "time": 1765733924356, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 69.57925000000068, + "diffMs": 0.11404099999981554, + "writeMs": 0.0005000000001018634, + "frameMs": 69.70754100000067, + "memory": { + "rss": 1120813056, + "heapTotal": 136930304, + "heapUsed": 97968654, + "external": 85341406 + } + }, + { + "id": 60, + "time": 1765733924426, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 70.50420800000029, + "diffMs": 0.10850000000027649, + "writeMs": 0.0006669999993391684, + "frameMs": 70.62775000000056, + "memory": { + "rss": 1120813056, + "heapTotal": 136930304, + "heapUsed": 97969233, + "external": 85341441 + } + }, + { + "id": 61, + "time": 1765733924497, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 25, + "diffCellsChanged": 2, + "diffOps": 4, + "diffCursorMoves": 2, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 71.04075000000012, + "diffMs": 0.10554199999933189, + "writeMs": 0.00020799999947485048, + "frameMs": 71.15829200000007, + "memory": { + "rss": 1120813056, + "heapTotal": 136930304, + "heapUsed": 97969587, + "external": 85341475 + } + }, + { + "id": 62, + "time": 1765733924569, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 71.37566700000025, + "diffMs": 0.11270899999999529, + "writeMs": 0.0006249999996725819, + "frameMs": 71.50441600000067, + "memory": { + "rss": 1120813056, + "heapTotal": 136930304, + "heapUsed": 97970197, + "external": 85341509 + } + }, + { + "id": 63, + "time": 1765733924640, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 70.53949999999986, + "diffMs": 0.13008300000001327, + "writeMs": 0.0006249999996725819, + "frameMs": 70.6865829999997, + "memory": { + "rss": 1120813056, + "heapTotal": 136930304, + "heapUsed": 97970197, + "external": 85341509 + } + }, + { + "id": 64, + "time": 1765733924712, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 73.3341249999994, + "diffMs": 0.1207910000002812, + "writeMs": 0.0005830000000059954, + "frameMs": 73.47245800000019, + "memory": { + "rss": 1120813056, + "heapTotal": 136930304, + "heapUsed": 97970776, + "external": 85341544 + } + }, + { + "id": 65, + "time": 1765733924785, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 71.2661250000001, + "diffMs": 0.11904199999935372, + "writeMs": 0.0006249999996725819, + "frameMs": 71.40008300000045, + "memory": { + "rss": 1120813056, + "heapTotal": 136930304, + "heapUsed": 97971130, + "external": 85341578 + } + }, + { + "id": 66, + "time": 1765733924857, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 71.47033300000021, + "diffMs": 0.10237499999948341, + "writeMs": 0.0004580000004352769, + "frameMs": 71.58716699999968, + "memory": { + "rss": 1120813056, + "heapTotal": 136930304, + "heapUsed": 97971740, + "external": 85341612 + } + }, + { + "id": 67, + "time": 1765733924929, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 69.61225000000013, + "diffMs": 0.11295799999970768, + "writeMs": 0.0002919999997175182, + "frameMs": 69.7372089999999, + "memory": { + "rss": 1120813056, + "heapTotal": 136930304, + "heapUsed": 97971740, + "external": 85341612 + } + }, + { + "id": 68, + "time": 1765733924999, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 70.28983399999925, + "diffMs": 0.10350000000016735, + "writeMs": 0.0003329999999550637, + "frameMs": 70.40620900000067, + "memory": { + "rss": 1120813056, + "heapTotal": 136930304, + "heapUsed": 97972319, + "external": 85341647 + } + }, + { + "id": 69, + "time": 1765733925070, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 70.72091699999964, + "diffMs": 0.11270899999999529, + "writeMs": 0.0003750000005311449, + "frameMs": 70.8466670000007, + "memory": { + "rss": 1120813056, + "heapTotal": 136930304, + "heapUsed": 97972673, + "external": 85341681 + } + }, + { + "id": 70, + "time": 1765733925141, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 70.56529200000023, + "diffMs": 0.1025419999996302, + "writeMs": 0.00045899999986431794, + "frameMs": 70.6772920000003, + "memory": { + "rss": 1120813056, + "heapTotal": 136930304, + "heapUsed": 97973283, + "external": 85341715 + } + }, + { + "id": 71, + "time": 1765733925212, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 25, + "diffCellsChanged": 2, + "diffOps": 4, + "diffCursorMoves": 2, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 71.46125000000029, + "diffMs": 0.10695799999939481, + "writeMs": 0.0003749999996216502, + "frameMs": 71.57966699999997, + "memory": { + "rss": 1120813056, + "heapTotal": 136930304, + "heapUsed": 97974828, + "external": 85341756 + } + }, + { + "id": 72, + "time": 1765733925284, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 71.03662500000064, + "diffMs": 0.12466699999913544, + "writeMs": 0.0006250000005820766, + "frameMs": 71.17741699999988, + "memory": { + "rss": 1120813056, + "heapTotal": 136930304, + "heapUsed": 97975157, + "external": 85341781 + } + }, + { + "id": 73, + "time": 1765733925355, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 69.71837499999947, + "diffMs": 0.10433300000022427, + "writeMs": 0.0004169999992882367, + "frameMs": 69.83470800000032, + "memory": { + "rss": 1120813056, + "heapTotal": 136930304, + "heapUsed": 97975157, + "external": 85341781 + } + }, + { + "id": 74, + "time": 1765733925425, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 71.05270800000017, + "diffMs": 0.109375, + "writeMs": 0.0005830000000059954, + "frameMs": 71.17658399999982, + "memory": { + "rss": 1120813056, + "heapTotal": 136930304, + "heapUsed": 97975992, + "external": 85341816 + } + }, + { + "id": 75, + "time": 1765733925497, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 70.82579200000055, + "diffMs": 0.10070900000027905, + "writeMs": 0.000249999999141437, + "frameMs": 70.93808400000034, + "memory": { + "rss": 1120813056, + "heapTotal": 136930304, + "heapUsed": 97976346, + "external": 85341850 + } + }, + { + "id": 76, + "time": 1765733925568, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 70.2588340000002, + "diffMs": 0.10720800000035524, + "writeMs": 0.0005000000001018634, + "frameMs": 70.37716699999964, + "memory": { + "rss": 1120813056, + "heapTotal": 136930304, + "heapUsed": 97976700, + "external": 85341884 + } + }, + { + "id": 77, + "time": 1765733925639, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 70.28304200000002, + "diffMs": 0.10499999999956344, + "writeMs": 0.00045899999986431794, + "frameMs": 70.40087499999936, + "memory": { + "rss": 1120813056, + "heapTotal": 136930304, + "heapUsed": 97976700, + "external": 85341884 + } + }, + { + "id": 78, + "time": 1765733925710, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 71.43133300000045, + "diffMs": 0.1054999999996653, + "writeMs": 0.0003329999999550637, + "frameMs": 71.55099999999948, + "memory": { + "rss": 1120813056, + "heapTotal": 136930304, + "heapUsed": 97977535, + "external": 85341919 + } + }, + { + "id": 79, + "time": 1765733925781, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 71.44925000000057, + "diffMs": 0.11112500000035652, + "writeMs": 0.0004999999991923687, + "frameMs": 71.57437500000015, + "memory": { + "rss": 1120813056, + "heapTotal": 136930304, + "heapUsed": 97977889, + "external": 85341953 + } + }, + { + "id": 80, + "time": 1765733925853, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 70.8633749999999, + "diffMs": 0.1156250000003638, + "writeMs": 0.0002500000000509317, + "frameMs": 70.99029200000041, + "memory": { + "rss": 1120813056, + "heapTotal": 136930304, + "heapUsed": 97978243, + "external": 85341987 + } + }, + { + "id": 81, + "time": 1765733925925, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 25, + "diffCellsChanged": 2, + "diffOps": 4, + "diffCursorMoves": 2, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 69.19666599999982, + "diffMs": 0.1092079999998532, + "writeMs": 0.0005000000001018634, + "frameMs": 69.31887499999993, + "memory": { + "rss": 1120813056, + "heapTotal": 136930304, + "heapUsed": 97978243, + "external": 85341987 + } + }, + { + "id": 82, + "time": 1765733925994, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 71.90999999999985, + "diffMs": 0.1101249999992433, + "writeMs": 0.00029100000028847717, + "frameMs": 72.03441699999985, + "memory": { + "rss": 1120813056, + "heapTotal": 136930304, + "heapUsed": 97979078, + "external": 85342022 + } + }, + { + "id": 83, + "time": 1765733926067, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 71.26400000000012, + "diffMs": 0.10941599999932805, + "writeMs": 0.0005000000001018634, + "frameMs": 71.38875000000007, + "memory": { + "rss": 1120829440, + "heapTotal": 136930304, + "heapUsed": 97979432, + "external": 85342056 + } + }, + { + "id": 84, + "time": 1765733926138, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 70.96279200000026, + "diffMs": 0.10570800000004965, + "writeMs": 0.0005000000001018634, + "frameMs": 71.07991700000002, + "memory": { + "rss": 1120829440, + "heapTotal": 136930304, + "heapUsed": 97981906, + "external": 85343986 + } + }, + { + "id": 85, + "time": 1765733926210, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 72.71125000000029, + "diffMs": 0.12095899999985704, + "writeMs": 0.0002920000006270129, + "frameMs": 72.847084, + "memory": { + "rss": 1120829440, + "heapTotal": 136930304, + "heapUsed": 97983707, + "external": 85344027 + } + }, + { + "id": 86, + "time": 1765733926283, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 72.18654200000037, + "diffMs": 0.11612499999955617, + "writeMs": 0.00029100000028847717, + "frameMs": 72.31520799999998, + "memory": { + "rss": 1120829440, + "heapTotal": 136930304, + "heapUsed": 97984028, + "external": 85344044 + } + }, + { + "id": 87, + "time": 1765733926355, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 70.01666599999953, + "diffMs": 0.11074999999982538, + "writeMs": 0.0004580000004352769, + "frameMs": 70.14091599999938, + "memory": { + "rss": 1120829440, + "heapTotal": 136930304, + "heapUsed": 97984028, + "external": 85344044 + } + }, + { + "id": 88, + "time": 1765733926426, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 71.8720830000002, + "diffMs": 0.1106660000004922, + "writeMs": 0.0007079999995767139, + "frameMs": 71.99799999999959, + "memory": { + "rss": 1120829440, + "heapTotal": 136930304, + "heapUsed": 97984607, + "external": 85344079 + } + }, + { + "id": 89, + "time": 1765733926498, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 71.68437500000073, + "diffMs": 0.109958000000006, + "writeMs": 0.0004170000001977314, + "frameMs": 71.80566700000054, + "memory": { + "rss": 1120829440, + "heapTotal": 136930304, + "heapUsed": 97984961, + "external": 85344113 + } + }, + { + "id": 90, + "time": 1765733926570, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 71.31354199999987, + "diffMs": 0.11041699999987031, + "writeMs": 0.0005419999997684499, + "frameMs": 71.43837499999972, + "memory": { + "rss": 1120829440, + "heapTotal": 136930304, + "heapUsed": 97985571, + "external": 85344147 + } + }, + { + "id": 91, + "time": 1765733926642, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 25, + "diffCellsChanged": 2, + "diffOps": 4, + "diffCursorMoves": 2, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 69.41054199999962, + "diffMs": 0.11370799999986048, + "writeMs": 0.0003329999999550637, + "frameMs": 69.53620800000044, + "memory": { + "rss": 1120829440, + "heapTotal": 136930304, + "heapUsed": 97985571, + "external": 85344147 + } + }, + { + "id": 92, + "time": 1765733926712, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 71.48937500000011, + "diffMs": 0.11999999999989086, + "writeMs": 0.0006249999996725819, + "frameMs": 71.62387500000023, + "memory": { + "rss": 1120829440, + "heapTotal": 136930304, + "heapUsed": 97986150, + "external": 85344182 + } + }, + { + "id": 93, + "time": 1765733926784, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 71.73654200000055, + "diffMs": 0.10891699999956472, + "writeMs": 0.0004579999995257822, + "frameMs": 71.86083299999973, + "memory": { + "rss": 1120829440, + "heapTotal": 136930304, + "heapUsed": 97986504, + "external": 85344216 + } + }, + { + "id": 94, + "time": 1765733926856, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 71.20204199999989, + "diffMs": 0.10962500000005093, + "writeMs": 0.0003750000005311449, + "frameMs": 71.32316600000013, + "memory": { + "rss": 1120829440, + "heapTotal": 136930304, + "heapUsed": 97987114, + "external": 85344250 + } + }, + { + "id": 95, + "time": 1765733926927, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 69.23733300000004, + "diffMs": 0.11133299999983137, + "writeMs": 0.0005409999994299142, + "frameMs": 69.36208399999941, + "memory": { + "rss": 1120829440, + "heapTotal": 136930304, + "heapUsed": 97987114, + "external": 85344250 + } + }, + { + "id": 96, + "time": 1765733926997, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 70.74866699999984, + "diffMs": 0.11079200000040146, + "writeMs": 0.0005000000001018634, + "frameMs": 70.87045900000066, + "memory": { + "rss": 1120829440, + "heapTotal": 136930304, + "heapUsed": 97988293, + "external": 85344661 + } + }, + { + "id": 97, + "time": 1765733927068, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 71.2742500000004, + "diffMs": 0.10816699999941193, + "writeMs": 0.00020800000038434519, + "frameMs": 71.39291700000012, + "memory": { + "rss": 1120829440, + "heapTotal": 136930304, + "heapUsed": 97988647, + "external": 85344695 + } + }, + { + "id": 98, + "time": 1765733927140, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 72.38925000000017, + "diffMs": 0.11295900000004622, + "writeMs": 0.015582999999423919, + "frameMs": 72.53145900000072, + "memory": { + "rss": 1120829440, + "heapTotal": 136930304, + "heapUsed": 97989257, + "external": 85344729 + } + }, + { + "id": 99, + "time": 1765733927213, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 71.51408300000003, + "diffMs": 0.1334999999999127, + "writeMs": 0.011958000000049651, + "frameMs": 71.67075000000023, + "memory": { + "rss": 1120829440, + "heapTotal": 136930304, + "heapUsed": 97991026, + "external": 85344770 + } + }, + { + "id": 100, + "time": 1765733927285, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 72.39520900000025, + "diffMs": 0.10870900000008987, + "writeMs": 0.0006249999996725819, + "frameMs": 72.51966700000048, + "memory": { + "rss": 1120829440, + "heapTotal": 136930304, + "heapUsed": 97991347, + "external": 85344787 + } + }, + { + "id": 101, + "time": 1765733927358, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 33, + "diffCellsChanged": 3, + "diffOps": 5, + "diffCursorMoves": 3, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 69.72724999999991, + "diffMs": 0.13595900000018446, + "writeMs": 0.0028750000001309672, + "frameMs": 69.88395800000035, + "memory": { + "rss": 1120845824, + "heapTotal": 136930304, + "heapUsed": 97991347, + "external": 85344787 + } + }, + { + "id": 102, + "time": 1765733927428, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 72.3774169999997, + "diffMs": 0.11795900000015536, + "writeMs": 0.00016599999980826396, + "frameMs": 72.53349999999955, + "memory": { + "rss": 1120845824, + "heapTotal": 136946688, + "heapUsed": 98003809, + "external": 85353073 + } + }, + { + "id": 103, + "time": 1765733927501, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 71.75429200000053, + "diffMs": 0.10754199999973935, + "writeMs": 0.00020899999981338624, + "frameMs": 71.8734999999997, + "memory": { + "rss": 1120845824, + "heapTotal": 136946688, + "heapUsed": 98005132, + "external": 85353852 + } + }, + { + "id": 104, + "time": 1765733927573, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 71.99499999999989, + "diffMs": 0.11204099999940809, + "writeMs": 0.00016699999923730502, + "frameMs": 72.11862500000007, + "memory": { + "rss": 1120845824, + "heapTotal": 136946688, + "heapUsed": 98005487, + "external": 85353887 + } + }, + { + "id": 105, + "time": 1765733927645, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 69.5649169999997, + "diffMs": 0.11766699999952834, + "writeMs": 0.00004199999966658652, + "frameMs": 69.69208299999991, + "memory": { + "rss": 1120845824, + "heapTotal": 136946688, + "heapUsed": 98005487, + "external": 85353887 + } + }, + { + "id": 106, + "time": 1765733927715, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 72.17745800000012, + "diffMs": 0.10775000000012369, + "writeMs": 0.0001249999995707185, + "frameMs": 72.29550000000017, + "memory": { + "rss": 1120845824, + "heapTotal": 136946688, + "heapUsed": 98006323, + "external": 85353923 + } + }, + { + "id": 107, + "time": 1765733927788, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 74.51858300000004, + "diffMs": 0.11049999999977445, + "writeMs": 0.00008299999990413198, + "frameMs": 74.6436249999997, + "memory": { + "rss": 1120845824, + "heapTotal": 136946688, + "heapUsed": 98006678, + "external": 85353958 + } + }, + { + "id": 108, + "time": 1765733927863, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 73.43720800000028, + "diffMs": 0.10574999999971624, + "writeMs": 0.0001249999995707185, + "frameMs": 73.55866700000024, + "memory": { + "rss": 1120845824, + "heapTotal": 136946688, + "heapUsed": 98007033, + "external": 85353993 + } + }, + { + "id": 109, + "time": 1765733927936, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 70.35699999999997, + "diffMs": 0.11870900000030815, + "writeMs": 0.00016599999980826396, + "frameMs": 70.48608400000012, + "memory": { + "rss": 1120845824, + "heapTotal": 136946688, + "heapUsed": 98007033, + "external": 85353993 + } + }, + { + "id": 110, + "time": 1765733928007, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 72.00979200000074, + "diffMs": 0.1279579999991256, + "writeMs": 0.00008299999990413198, + "frameMs": 72.1513329999998, + "memory": { + "rss": 1120845824, + "heapTotal": 136946688, + "heapUsed": 98007869, + "external": 85354029 + } + }, + { + "id": 111, + "time": 1765733928080, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 25, + "diffCellsChanged": 2, + "diffOps": 4, + "diffCursorMoves": 2, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 71.27558300000055, + "diffMs": 0.10316700000021228, + "writeMs": 0.00016699999923730502, + "frameMs": 71.3877910000001, + "memory": { + "rss": 1120845824, + "heapTotal": 136946688, + "heapUsed": 98010000, + "external": 85354064 + } + }, + { + "id": 112, + "time": 1765733928152, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 72.05016700000033, + "diffMs": 0.1051660000002812, + "writeMs": 0.0002920000006270129, + "frameMs": 72.16658300000017, + "memory": { + "rss": 1120845824, + "heapTotal": 136946688, + "heapUsed": 98010355, + "external": 85354099 + } + }, + { + "id": 113, + "time": 1765733928224, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 74.12370900000042, + "diffMs": 0.1117500000000291, + "writeMs": 0.0001250000004802132, + "frameMs": 74.24629199999981, + "memory": { + "rss": 1120845824, + "heapTotal": 136946688, + "heapUsed": 98012436, + "external": 85354148 + } + }, + { + "id": 114, + "time": 1765733928299, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 73.06266700000015, + "diffMs": 0.12237499999901047, + "writeMs": 0.00008300000081362668, + "frameMs": 73.19658300000083, + "memory": { + "rss": 1120845824, + "heapTotal": 136946688, + "heapUsed": 98012757, + "external": 85354165 + } + }, + { + "id": 115, + "time": 1765733928372, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 70.25895800000035, + "diffMs": 0.10916700000052515, + "writeMs": 0.00016700000014679972, + "frameMs": 70.378917, + "memory": { + "rss": 1120845824, + "heapTotal": 136979456, + "heapUsed": 98012757, + "external": 85354165 + } + }, + { + "id": 116, + "time": 1765733928443, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 71.50849999999991, + "diffMs": 0.10645800000020245, + "writeMs": 0.00008300000081362668, + "frameMs": 71.62487500000134, + "memory": { + "rss": 1120845824, + "heapTotal": 136979456, + "heapUsed": 98013337, + "external": 85354201 + } + }, + { + "id": 117, + "time": 1765733928515, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 82.11287500000071, + "diffMs": 0.11566700000003038, + "writeMs": 0.0002500000009604264, + "frameMs": 82.23929099999987, + "memory": { + "rss": 1120845824, + "heapTotal": 136979456, + "heapUsed": 98013692, + "external": 85354236 + } + }, + { + "id": 118, + "time": 1765733928597, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 83.2497919999987, + "diffMs": 0.28716700000040873, + "writeMs": 0.0001250000004802132, + "frameMs": 83.55191700000069, + "memory": { + "rss": 1120845824, + "heapTotal": 136979456, + "heapUsed": 98014303, + "external": 85354271 + } + }, + { + "id": 119, + "time": 1765733928681, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 74.48354199999994, + "diffMs": 0.11258300000008603, + "writeMs": 0.0003329999999550637, + "frameMs": 74.60979200000111, + "memory": { + "rss": 1120845824, + "heapTotal": 136979456, + "heapUsed": 98014303, + "external": 85354271 + } + }, + { + "id": 120, + "time": 1765733928756, + "rows": 40, + "cols": 120, + "nodeCount": 10002, + "outputBytes": 17, + "diffCellsChanged": 1, + "diffOps": 3, + "diffCursorMoves": 1, + "diffStyleChanges": 1, + "diffResets": 1, + "diffFullRedraw": false, + "layoutMs": 0, + "renderMs": 73.93204200000037, + "diffMs": 0.11545900000055553, + "writeMs": 0.00016700000014679972, + "frameMs": 74.06354099999953, + "memory": { + "rss": 1120845824, + "heapTotal": 136979456, + "heapUsed": 98017339, + "external": 85356539 + } + } + ], + "summary": { + "frameCount": 120, + "frameMs": { + "p50": 70.8466670000007, + "p95": 74.6436249999997, + "p99": 82.23929099999987, + "max": 127.667292 + }, + "totals": { + "layoutMs": 54.271291000000005, + "renderMs": 8522.248087000007, + "diffMs": 14.32616699999511, + "writeMs": 0.1235779999965132, + "frameMs": 8593.173503000009 + } + } +} \ No newline at end of file diff --git a/scripts/profiler-core.ts b/scripts/profiler-core.ts index 5c7edec..a68bcac 100644 --- a/scripts/profiler-core.ts +++ b/scripts/profiler-core.ts @@ -1,399 +1,142 @@ -import type { Buffer2D } from "../packages/renderer/src/types/buffer"; +type FrameMetrics = { + id: number; + time: number; + rows: number; + cols: number; + nodeCount?: number; + outputBytes?: number; + diffCellsChanged?: number; + diffOps?: number; + diffCursorMoves?: number; + diffStyleChanges?: number; + diffResets?: number; + diffFullRedraw?: boolean; + layoutMs: number; + renderMs: number; + diffMs: number; + writeMs: number; + frameMs: number; + memory?: { + rss: number; + heapTotal: number; + heapUsed: number; + external: number; + }; +}; + +export type ProfilerLog = { + version: 1; + startedAt: string; + endedAt: string; + frames: FrameMetrics[]; + summary: { + frameCount: number; + frameMs: { p50: number; p95: number; p99: number; max: number }; + totals: { + layoutMs: number; + renderMs: number; + diffMs: number; + writeMs: number; + frameMs: number; + }; + }; +}; -/** - * Performance profiler core for btuin package. - * - * - CPU時間・メモリ使用量の計測 - * - フレーム単位の計測(P95/P99) - * - フラグメンテーション/スケーラビリティ測定 - * - * このモジュールはテストやスクリプトから再利用される「コアロジック」として切り出されており、 - * 実際のプロファイリングシナリオは `scripts/profiler.spec.ts` や - * `scripts/profiler.io.spec.ts` 側で定義する。 - */ +const formatMs = (value: number) => `${value.toFixed(2)}ms`; -/** - * プロファイルメトリクス(1つの測定単位ごと) - */ -export interface ProfileMetrics { - name: string; - duration: number; - memoryBefore?: number; - memoryAfter?: number; - memoryDelta?: number; - peakMemory?: number; - operationCount: number; - opsPerSecond: number; - memoryEfficiency?: number; // ops per MB - p99Duration?: number; - p95Duration?: number; +function describeFrame(frame: FrameMetrics) { + const diffCells = frame.diffCellsChanged ?? 0; + const diffOps = frame.diffOps ?? 0; + return `frame ${frame.id} → ${formatMs(frame.frameMs)} (layout ${formatMs(frame.layoutMs)}, render ${formatMs( + frame.renderMs, + )}, diff ${formatMs(frame.diffMs)}, write ${formatMs(frame.writeMs)}) diffCells=${diffCells} diffOps=${diffOps}`; } -/** - * フレーム単位メトリクス - */ -export interface FrameMetrics { - frameNumber: number; - duration: number; - timestamp: number; +function summarizeFrames(frames: FrameMetrics[], key: keyof FrameMetrics, limit = 3) { + return [...frames] + .filter((frame) => typeof frame[key] === "number") + .sort((a, b) => (b[key] as number) - (a[key] as number)) + .slice(0, limit); } -/** - * プロファイラ全体の集約統計。 - * 1回のプロファイル実行内での分布やホットスポットを俯瞰するために使う。 - */ -export interface ProfilerSummary { - // 時間系(全メトリクスの duration 分布) - totalDuration: number; - meanDuration: number; - medianDuration: number; - p95Duration: number; - p99Duration: number; - - // メモリ系 - peakMemory: number; - totalPositiveMemoryDelta: number; - totalNegativeMemoryDelta: number; - - // ホットスポット(上位N件) - topByDuration: ProfileMetrics[]; - topByMemoryDelta: ProfileMetrics[]; - - // フレーム統計(measureFrames が使われた場合のみ) - frameStats?: { - count: number; - mean: number; - min: number; - max: number; - p95: number; - p99: number; - }; +function peakMemory(frames: FrameMetrics[]) { + return frames.reduce( + (acc, frame) => { + if (frame.memory && frame.memory.heapUsed > acc.heapUsed) { + acc.heapUsed = frame.memory.heapUsed; + acc.frame = frame; + } + return acc; + }, + { heapUsed: -Infinity, frame: null as FrameMetrics | null }, + ); } -/** - * btuin 向け汎用プロファイラコア。 - * - * - できるだけ「計測ロジック」に責務を絞る - * - 実際に何を計測するか(List, BufferPool, IO など)は呼び出し側に委ねる - */ -export class Profiler { - private metrics: ProfileMetrics[] = []; - private frameMetrics: FrameMetrics[] = []; - private peakMemoryUsage: number = 0; - - /** - * 任意の関数の実行時間とメモリ使用量を計測する。 - */ - measure( - name: string, - fn: () => void, - operationCount: number = 1, - ): ProfileMetrics { - const memBefore = process.memoryUsage(); - const start = performance.now(); - - fn(); - - const end = performance.now(); - const memAfter = process.memoryUsage(); - const duration = end - start; - const opsPerSecond = (operationCount / duration) * 1000; - - const memoryDelta = memAfter.heapUsed - memBefore.heapUsed; - const peakMemory = Math.max(this.peakMemoryUsage, memAfter.heapUsed); - this.peakMemoryUsage = peakMemory; - - const memoryEfficiency = - memoryDelta > 0 - ? operationCount / (memoryDelta / 1024 / 1024) - : undefined; - - const metric: ProfileMetrics = { - name, - duration, - memoryBefore: memBefore.heapUsed, - memoryAfter: memAfter.heapUsed, - memoryDelta, - peakMemory, - operationCount, - opsPerSecond, - memoryEfficiency, - }; - - this.metrics.push(metric); - return metric; +export function printSummary(log: ProfilerLog) { + const { frames } = log; + const totals = log.summary.totals; + const avgFrame = frames.length ? totals.frameMs / frames.length : 0; + const renderShare = totals.frameMs ? (totals.renderMs / totals.frameMs) * 100 : 0; + console.log("-".repeat(60)); + console.log(`Profile summary (${log.startedAt} → ${log.endedAt})`); + console.log(` total frames : ${log.summary.frameCount} (avg ${formatMs(avgFrame)})`); + console.log( + ` distribution : p50 ${formatMs(log.summary.frameMs.p50)}, p95 ${formatMs( + log.summary.frameMs.p95, + )}, p99 ${formatMs(log.summary.frameMs.p99)}, max ${formatMs(log.summary.frameMs.max)}`, + ); + console.log( + ` totals : layout ${formatMs(totals.layoutMs)}, render ${formatMs(totals.renderMs)}, diff ${formatMs( + totals.diffMs, + )}, write ${formatMs(totals.writeMs)} (render share ${renderShare.toFixed(1)}%)`, + ); + + if (frames.length === 0) { + console.log(" (no frames recorded)"); + return; } - /** - * フレームループ(レンダリングシミュレーション)の計測。 - * - * - 各フレームの duration を記録 - * - P95/P99 フレーム時間を集計 - */ - measureFrames( - name: string, - fn: (frameNumber: number) => void, - frameCount: number = 60, - ): FrameMetrics[] { - const frames: FrameMetrics[] = []; - const startTime = performance.now(); - - for (let i = 0; i < frameCount; i++) { - const frameStart = performance.now(); - fn(i); - const frameEnd = performance.now(); - const duration = frameEnd - frameStart; - - frames.push({ - frameNumber: i, - duration, - timestamp: frameStart - startTime, - }); - } - - const totalDuration = frames.reduce((sum, f) => sum + f.duration, 0); - - const metric: ProfileMetrics = { - name: `${name} (frame simulation)`, - duration: totalDuration, - operationCount: frameCount, - opsPerSecond: (frameCount / totalDuration) * 1000, - p99Duration: this.calculatePercentile( - frames.map((f) => f.duration), - 99, - ), - p95Duration: this.calculatePercentile( - frames.map((f) => f.duration), - 95, - ), - }; - - this.metrics.push(metric); - this.frameMetrics.push(...frames); - - return frames; + const [slowest, ...rest] = summarizeFrames(frames, "frameMs", 3); + console.log(" spikes:"); + if (slowest) { + console.log(` - Slowest: ${describeFrame(slowest)}`); } + rest.forEach((frame) => console.log(` - ${describeFrame(frame)}`)); - /** - * バッファのアロケーション/デアロケーションを複数サイクル実行し、 - * フラグメンテーションパターンとメモリ変化を測定する。 - */ - measureFragmentation( - name: string, - allocFn: () => Buffer2D[], - deallocFn: (buffers: Buffer2D[]) => void, - cycles: number = 100, - ): ProfileMetrics { - const memBefore = process.memoryUsage(); - const start = performance.now(); - - for (let i = 0; i < cycles; i++) { - const buffers = allocFn(); - deallocFn(buffers); - } - - const end = performance.now(); - const memAfter = process.memoryUsage(); - const duration = end - start; - const opsPerSecond = (cycles / duration) * 1000; - - const memoryDelta = memAfter.heapUsed - memBefore.heapUsed; - const peakMemory = Math.max(this.peakMemoryUsage, memAfter.heapUsed); - this.peakMemoryUsage = peakMemory; - - const metric: ProfileMetrics = { - name: `${name} (fragmentation test)`, - duration, - memoryBefore: memBefore.heapUsed, - memoryAfter: memAfter.heapUsed, - memoryDelta, - peakMemory, - operationCount: cycles, - opsPerSecond, - }; - - this.metrics.push(metric); - return metric; + const smallest = [...frames].sort((a, b) => a.frameMs - b.frameMs)[0]; + if (smallest) { + console.log(` smoothest: ${describeFrame(smallest)} (best frame)`); } - /** - * データサイズを変化させながらスケーラビリティを測定する。 - * - * 1サイズにつき1回実行し、その duration / ops/sec / memoryDelta を記録する。 - */ - measureScalability( - name: string, - fn: (size: number) => void, - sizes: number[], - ): void { - for (const size of sizes) { - const memBefore = process.memoryUsage(); - const start = performance.now(); - - fn(size); + const renderPeaks = summarizeFrames(frames, "renderMs", 3); + console.log(" render bottlenecks:"); + renderPeaks.forEach((frame) => + console.log(` - ${describeFrame(frame)} (render-heavy)`), + ); - const end = performance.now(); - const memAfter = process.memoryUsage(); - const duration = end - start; - - const memoryDelta = memAfter.heapUsed - memBefore.heapUsed; - const peakMemory = Math.max(this.peakMemoryUsage, memAfter.heapUsed); - this.peakMemoryUsage = peakMemory; - - const metric: ProfileMetrics = { - name: `${name} (size: ${size})`, - duration, - memoryBefore: memBefore.heapUsed, - memoryAfter: memAfter.heapUsed, - memoryDelta, - peakMemory, - operationCount: 1, - opsPerSecond: (1 / duration) * 1000, - }; - - this.metrics.push(metric); - } - } - - /** - * 単純なパーセンタイル計算(昇順ソート → インデックス計算)。 - */ - private calculatePercentile( - values: number[], - percentile: number, - ): number { - const sorted = [...values].sort((a, b) => a - b); - const index = Math.ceil((percentile / 100) * sorted.length) - 1; - return sorted[Math.max(0, index)]!; + const layoutPeak = summarizeFrames(frames, "layoutMs", 1)[0]; + if (layoutPeak) { + console.log(` layout peak : frame ${layoutPeak.id} (${formatMs(layoutPeak.layoutMs)})`); } - /** - * 人間向けの簡易レポートを stdout に出力する。 - * - * - 各メトリクスの duration / ops/sec / メモリ情報 - * - P95/P99(存在する場合) - * - 全体時間および最も遅いメトリクス名 - * - 追加で、集約統計(summary)も表示する - */ - report(): void { - if (this.metrics.length === 0) return; - - let totalTime = 0; - for (const metric of this.metrics) { - totalTime += metric.duration; - } - - for (const metric of this.metrics) { - const percentage = - totalTime > 0 - ? ((metric.duration / totalTime) * 100).toFixed(1) - : "0.0"; - console.log(`📊 ${metric.name}`); - console.log( - ` Duration: ${metric.duration.toFixed(2)}ms (${percentage}% of total)`, - ); - console.log(` Operations: ${metric.operationCount}`); - console.log(` Ops/sec: ${metric.opsPerSecond.toFixed(0)}`); - - if (metric.memoryDelta !== undefined && metric.memoryDelta !== 0) { - const sign = metric.memoryDelta >= 0 ? "+" : ""; - console.log( - ` Memory Δ: ${sign}${( - metric.memoryDelta / - 1024 / - 1024 - ).toFixed(2)}MB`, - ); - } - - if (metric.memoryEfficiency !== undefined) { - console.log( - ` Memory Efficiency: ${metric.memoryEfficiency.toFixed( - 0, - )} ops/MB`, - ); - } - - if (metric.p99Duration !== undefined) { - console.log( - ` P99 Frame Time: ${metric.p99Duration.toFixed( - 2, - )}ms (tail latency)`, - ); - } - - if (metric.p95Duration !== undefined) { - console.log( - ` P95 Frame Time: ${metric.p95Duration.toFixed( - 2, - )}ms (95th percentile)`, - ); - } - - console.log(); - } - - if (this.peakMemoryUsage > 0) { - console.log( - `📈 Peak Memory Usage: ${( - this.peakMemoryUsage / - 1024 / - 1024 - ).toFixed(2)}MB`, - ); - } - - console.log(`⏱️ Total Time: ${totalTime.toFixed(2)}ms`); - const slowest = this.getSlowest(); - console.log(`🔥 Hotspot: ${slowest?.name || "N/A"}`); - console.log(); - - } - - /** - * 最も遅いメトリクスを返す。 - */ - getSlowest(): ProfileMetrics | null { - if (this.metrics.length === 0) return null; - return this.metrics.reduce((prev, curr) => - curr.duration > prev.duration ? curr : prev, + const diffPeak = summarizeFrames(frames, "diffCellsChanged", 1)[0]; + if (diffPeak && (diffPeak.diffCellsChanged ?? 0) > 0) { + console.log( + ` diff spike : frame ${diffPeak.id}, ${diffPeak.diffCellsChanged} cells (${diffPeak.diffOps ?? 0} ops)`, ); } - /** - * duration 降順にソートしたメトリクス一覧を返す。 - */ - getSorted(): ProfileMetrics[] { - return [...this.metrics].sort((a, b) => b.duration - a.duration); - } - - /** - * 全メトリクスをコピーで返す。 - */ - getMetrics(): ProfileMetrics[] { - return [...this.metrics]; - } - - /** - * フレームメトリクス一覧をコピーで返す。 - */ - getFrameMetrics(): FrameMetrics[] { - return [...this.frameMetrics]; - } - - /** - * 記録されたピークメモリ(heapUsed)の生値を返す(バイト)。 - */ - getPeakMemory(): number { - return this.peakMemoryUsage; + const { frame: memFrame, heapUsed } = peakMemory(frames); + if (memFrame) { + console.log( + ` memory peak : frame ${memFrame.id}, heapUsed ${Math.round(heapUsed / 1024 / 1024)}MB (rss ${Math.round( + (memFrame.memory?.rss ?? 0) / 1024 / 1024, + )}MB)`, + ); } - /** - * 全メトリクスとピークメモリ情報をクリアする。 - */ - clear(): void { - this.metrics = []; - this.frameMetrics = []; - this.peakMemoryUsage = 0; - } + console.log(" takeaways:"); + console.log(" - Render is responsible for the biggest time slices; look into partial rendering or memoization."); + console.log(" - Layout, diff, and write stay low, so efforts should focus on taming render-heavy spikes."); + console.log("-".repeat(60)); } diff --git a/scripts/profiler-layout.test.ts b/scripts/profiler-layout.test.ts new file mode 100644 index 0000000..a694456 --- /dev/null +++ b/scripts/profiler-layout.test.ts @@ -0,0 +1,125 @@ +import { test, describe, expect } from "bun:test"; +import { existsSync } from "node:fs"; + +import { createApp, ref, Block, Text, type TerminalAdapter } from "../packages/btuin"; +import { printSummary, type ProfilerLog } from "./profiler-core"; + +// This test intentionally mutates layout-relevant props every frame to stress: +// - view() construction cost +// - JS->WASM bridge (flattenTree + nodes array build) +// - WASM compute_layout cost +// +// It uses the same harness style as profiler-stress.test.ts (createApp + Profiler JSON output). + +const n = 4_000; +const frames = 120; +const intervalMs = 16; +const hud = false; +const out = `profiles/layout-${Date.now()}.json`; + +const tick = ref(0); +let resolveFinished: (() => void) | null = null; +const finished = new Promise((resolve) => { + resolveFinished = resolve; +}); + +function createNullTerminalAdapter(size: { rows: number; cols: number }): TerminalAdapter { + return { + setupRawMode() {}, + clearScreen() {}, + cleanupWithoutClear() {}, + patchConsole() {}, + startCapture() {}, + onKey() {}, + getTerminalSize() { + return size; + }, + disposeSingletonCapture() {}, + write() {}, + }; +} + +// Reuse leaf Text nodes to avoid making this purely an allocation benchmark. +const leaves = Array.from({ length: n }, (_, i) => Text(`item ${i}`).foreground("gray")); + +function buildTree(t: number) { + const root = Block() + .direction(t % 2 === 0 ? "column" : "row") + .gap(t % 4) + .padding((t % 3) as 0 | 1 | 2); + + root.add(Text(`layout-change-stress n=${n} tick=${t}`).foreground("cyan")); + + for (let i = 0; i < leaves.length; i++) { + const leaf = leaves[i]!; + // Wrap each leaf to force style changes to impact layout each frame. + const box = Block() + .direction(t % 3 === 0 ? "row" : "column") + .padding(((t + i) % 2) as 0 | 1); + + // Vary width/height frequently to invalidate computed layout. + if (t % 2 === 0) { + box.width((i % 20) + 5); + box.height(1); + box.grow(((i + t) % 3) + 1); + box.shrink(((i + t) % 2) + 1); + } else { + box.width("auto"); + box.height(1); + box.grow(((i + t) % 2) + 1); + box.shrink(((i + t) % 3) + 1); + } + + box.add(leaf); + root.add(box); + } + + return root; +} + +const app = createApp({ + setup() { + let produced = 0; + const timer = setInterval(() => { + tick.value++; + produced++; + if (produced >= frames) { + clearInterval(timer); + resolveFinished?.(); + } + }, intervalMs); + + return () => buildTree(tick.value); + }, + terminal: createNullTerminalAdapter({ rows: 40, cols: 120 }), + profile: { + enabled: true, + hud, + outputFile: out, + maxFrames: frames, + nodeCount: true, + }, +}); + +describe("Layout Change Stress Test", () => { + test( + "should run without errors", + async () => { + const appInstance = await app.mount(); + expect(appInstance.getComponent()).not.toBeNull(); + await finished; + appInstance.unmount(); + expect(existsSync(out)).toBe(true); + }, + { timeout: 60_000 }, + ); + + test("parsable jsonfile", async () => { + const log = await import(`../${out}`, { with: { type: "json" } }) as ProfilerLog + expect(log.startedAt).toBeDefined(); + expect(log.endedAt).toBeDefined(); + expect(log.frames).toBeDefined(); + expect(log.frames.length).toEqual(frames); + printSummary(log); + }); +}); diff --git a/scripts/profiler-stress.test.ts b/scripts/profiler-stress.test.ts new file mode 100644 index 0000000..ec3bf32 --- /dev/null +++ b/scripts/profiler-stress.test.ts @@ -0,0 +1,90 @@ +import { test, describe, expect } from "bun:test"; +import { existsSync } from "node:fs"; + +import { createApp, ref, Block, Text, type TerminalAdapter } from "../packages/btuin"; +import { printSummary, type ProfilerLog } from "./profiler-core"; + +const n = 10_000; +const frames = 120; +const intervalMs = 16; +const hud = false; +const out = `profiles/stress-${Date.now()}.json`; + +const tick = ref(0); +let resolveFinished: (() => void) | null = null; +const finished = new Promise((resolve) => { + resolveFinished = resolve; +}); + +function createNullTerminalAdapter(size: { rows: number; cols: number }): TerminalAdapter { + return { + setupRawMode() {}, + clearScreen() {}, + cleanupWithoutClear() {}, + patchConsole() {}, + startCapture() {}, + onKey() {}, + getTerminalSize() { + return size; + }, + disposeSingletonCapture() {}, + write() {}, + }; +} + +// Pre-build a large, mostly-static tree to stress layout+render traversal. +const items = Array.from({ length: n }, (_, i) => Text(`item ${i}`).foreground("gray")); +const header = Text("stress").foreground("cyan"); +const root = Block().direction("column"); +root.add(header); +for (const item of items) root.add(item); + +const app = createApp({ + setup() { + let produced = 0; + const timer = setInterval(() => { + tick.value++; + produced++; + if (produced >= frames) { + clearInterval(timer); + resolveFinished?.(); + } + }, intervalMs); + + return () => { + header.content = `stress n=${n} tick=${tick.value}`; + return root; + }; + }, + terminal: createNullTerminalAdapter({ rows: 40, cols: 120 }), + profile: { + enabled: true, + hud, + outputFile: out, + maxFrames: frames, + nodeCount: true, + }, +}); + +describe("Profiler Stress Test", () => { + test( + "should run without errors", + async () => { + const appInstance = await app.mount(); + expect(appInstance.getComponent()).not.toBeNull(); + await finished; + appInstance.unmount(); + expect(existsSync(out)).toBe(true); + }, + { timeout: 45_000 }, + ); + + test("parsable jsonfile", async () => { + const log = await import(`../${out}`, { with: { type: "json" } }) as ProfilerLog; + expect(log.startedAt).toBeDefined(); + expect(log.endedAt).toBeDefined(); + expect(log.frames).toBeDefined(); + expect(log.frames.length).toEqual(frames); + printSummary(log); + }); +}); From 22961374862de88b46088188ed17095482a96cfb Mon Sep 17 00:00:00 2001 From: HAL <68320771+HALQME@users.noreply.github.com> Date: Mon, 15 Dec 2025 08:46:28 +0900 Subject: [PATCH 02/12] Make renderer grapheme-aware and optimize runtime Add grapheme segmentation and width measurement and update FlatBuffer, grid, diff and drawText to handle multi-code-point and wide glyphs. Cache layout results in the render loop to avoid redundant layout computations. Add view key-handler traversal, make Profiler use Bun's fs APIs, enable layout-engine profiling, and update tests and profiles. --- .gitignore | 1 + package.json | 10 +- packages/btuin/src/runtime/profiler.ts | 20 +- packages/btuin/src/runtime/render-loop.ts | 35 +- packages/btuin/src/view/base.ts | 7 + .../btuin/src/view/components/component.ts | 29 + packages/btuin/tests/layout/renderer.test.ts | 7 +- .../tests/view/components/component.test.ts | 40 +- packages/layout-engine/src/index.ts | 26 + packages/reactivity/tests/index.test.ts | 0 packages/renderer/src/buffer.ts | 146 +- packages/renderer/src/diff.ts | 20 +- packages/renderer/src/grapheme.ts | 102 + packages/renderer/src/grid.ts | 83 +- packages/renderer/tests/buffer.test.ts | 13 +- packages/renderer/tests/diff.test.ts | 32 +- packages/renderer/tests/grapheme.test.ts | 31 + packages/renderer/tests/grid.test.ts | 8 +- packages/terminal/tests/index.test.ts | 0 profiles/layout-1765733911613.json | 3022 ---------------- profiles/stress-1765732169537.json | 3023 ----------------- profiles/stress-1765733920188.json | 3023 ----------------- scripts/profiler-core.ts | 18 + ...layout.test.ts => profiler-layout.spec.ts} | 31 +- ...stress.test.ts => profiler-stress.spec.ts} | 33 +- 25 files changed, 560 insertions(+), 9200 deletions(-) delete mode 100644 packages/reactivity/tests/index.test.ts create mode 100644 packages/renderer/src/grapheme.ts create mode 100644 packages/renderer/tests/grapheme.test.ts delete mode 100644 packages/terminal/tests/index.test.ts delete mode 100644 profiles/layout-1765733911613.json delete mode 100644 profiles/stress-1765732169537.json delete mode 100644 profiles/stress-1765733920188.json rename scripts/{profiler-layout.test.ts => profiler-layout.spec.ts} (79%) rename scripts/{profiler-stress.test.ts => profiler-stress.spec.ts} (71%) diff --git a/.gitignore b/.gitignore index db6120f..91a05eb 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ out out.* dist *.tgz +profiles/*.json # code coverage coverage diff --git a/package.json b/package.json index 2a2c60f..2c4ed08 100644 --- a/package.json +++ b/package.json @@ -6,15 +6,17 @@ "packages/*" ], "scripts": { - "start": "bun run --cwd packages/btuin src/app.ts", + "start": "bun run", "build": "bun run --cwd packages/btuin build.ts", "lint": "oxlint packages/*", "lint:fix": "oxlint packages/* --fix", "format": "oxfmt packages/*", - "test:all": "bun test packages", "test": "bun test packages/btuin packages/layout-engine packages/reactivity packages/renderer packages/terminal", - "profile:stress": "bun test scripts/profiler-stress.test.ts", - "profile:layout": "bun test scripts/profiler-layout.test.ts", + "test:watch": "pnpm test --watch", + "test:all": "bun test packages", + "profiler": "bun test scripts/profiler*.spec.ts", + "profiler:stress": "bun test scripts/profiler-stress.test.ts", + "profiler:layout": "bun test scripts/profiler-layout.test.ts", "check": "bunx tsc --noEmit" }, "devDependencies": { diff --git a/packages/btuin/src/runtime/profiler.ts b/packages/btuin/src/runtime/profiler.ts index 1260103..d151906 100644 --- a/packages/btuin/src/runtime/profiler.ts +++ b/packages/btuin/src/runtime/profiler.ts @@ -1,6 +1,5 @@ import type { Buffer2D } from "@btuin/renderer"; -import * as fsSync from "node:fs"; -import * as path from "node:path"; +import path from "node:path"; export interface ProfileOptions { /** @@ -338,18 +337,10 @@ export class Profiler { const dir = path.dirname(this.options.outputFile); if (dir && dir !== ".") { try { - fsSync.mkdirSync(dir, { recursive: true }); + Bun.$`mkdir -p ${dir}`; } catch {} } - // Bun.write exists in Bun; fall back to fs if needed. - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - if (typeof Bun !== "undefined" && typeof Bun.write === "function") { - await Bun.write(this.options.outputFile, output); - return; - } - - const fs = await import("node:fs/promises"); - await fs.writeFile(this.options.outputFile, output, "utf8"); + await Bun.write(this.options.outputFile, output); } flushSync(): void { @@ -359,10 +350,9 @@ export class Profiler { const dir = path.dirname(this.options.outputFile); if (dir && dir !== ".") { try { - fsSync.mkdirSync(dir, { recursive: true }); + Bun.$`mkdir -p ${dir}`; } catch {} } - // Keep it synchronous so SIGINT flows can safely persist before exit. - fsSync.writeFileSync(this.options.outputFile, output, "utf8"); + Bun.write(this.options.outputFile, output).then(); } } diff --git a/packages/btuin/src/runtime/render-loop.ts b/packages/btuin/src/runtime/render-loop.ts index 77504df..906ddd8 100644 --- a/packages/btuin/src/runtime/render-loop.ts +++ b/packages/btuin/src/runtime/render-loop.ts @@ -10,6 +10,7 @@ import type { ViewElement } from "../view/types/elements"; import { isBlock } from "../view/types/elements"; import { createErrorContext } from "./error-boundary"; import type { Profiler } from "./profiler"; +import type { ComputedLayout } from "@btuin/layout-engine"; /** * Terminal size configuration @@ -63,6 +64,10 @@ export function createRenderer(config: RenderLoopConfig) { prevBuffer: pool.acquire(), }; + let prevRootElement: ViewElement | null = null; + let prevLayoutResult: ComputedLayout | null = null; + let prevLayoutSizeKey: string | null = null; + /** * Performs a render cycle * @@ -85,6 +90,7 @@ export function createRenderer(config: RenderLoopConfig) { } const rootElement = config.view(config.getState()); + const layoutSizeKey = `${state.currentSize.cols}x${state.currentSize.rows}`; const nodeCount = config.profiler?.isEnabled() && config.profiler.options.nodeCount @@ -93,16 +99,25 @@ export function createRenderer(config: RenderLoopConfig) { const frame = config.profiler?.beginFrame(state.currentSize, { nodeCount }) ?? null; const layoutResult = - config.profiler?.measure(frame, "layoutMs", () => - layout(rootElement, { - width: state.currentSize.cols, - height: state.currentSize.rows, - }), - ) ?? - layout(rootElement, { - width: state.currentSize.cols, - height: state.currentSize.rows, - }); + rootElement === prevRootElement && + prevLayoutResult && + prevLayoutSizeKey === layoutSizeKey && + !sizeChanged + ? prevLayoutResult + : config.profiler?.measure(frame, "layoutMs", () => + layout(rootElement, { + width: state.currentSize.cols, + height: state.currentSize.rows, + }), + ) ?? + layout(rootElement, { + width: state.currentSize.cols, + height: state.currentSize.rows, + }); + + prevRootElement = rootElement; + prevLayoutResult = layoutResult; + prevLayoutSizeKey = layoutSizeKey; const buf = pool.acquire(); config.profiler?.measure(frame, "renderMs", () => { diff --git a/packages/btuin/src/view/base.ts b/packages/btuin/src/view/base.ts index 7cc00fc..e4eda26 100644 --- a/packages/btuin/src/view/base.ts +++ b/packages/btuin/src/view/base.ts @@ -1,3 +1,4 @@ +import type { KeyEventHook } from "./components/lifecycle"; import type { KeyEvent } from "@btuin/terminal"; import type { OutlineOptions } from "@btuin/renderer"; import type { Dimension, LayoutStyle } from "@btuin/layout-engine"; @@ -24,6 +25,7 @@ export abstract class BaseView implements ViewProps { public style: NonNullable = {}; public key?: string; public focusKey?: string; + public keyHooks: KeyEventHook[] = []; constructor(props: ViewProps = {}) { this.style = { ...props.style }; @@ -93,6 +95,11 @@ export abstract class BaseView implements ViewProps { return this; } + onKey(hook: KeyEventHook): this { + this.keyHooks.push(hook); + return this; + } + build(): this { return this; } diff --git a/packages/btuin/src/view/components/component.ts b/packages/btuin/src/view/components/component.ts index e392d96..2243fbe 100644 --- a/packages/btuin/src/view/components/component.ts +++ b/packages/btuin/src/view/components/component.ts @@ -5,6 +5,7 @@ * props, emits, and render function. */ import type { ViewElement } from "../types/elements"; +import { isBlock } from "../types/elements"; import type { KeyEvent } from "@btuin/terminal"; import { createComponentInstance, @@ -216,6 +217,25 @@ export function renderComponent(mounted: MountedComponent): ViewElement { return element; } +function traverseKeyHandlers( + element: ViewElement, + visitor: (element: ViewElement) => boolean, +): boolean { + if (isBlock(element)) { + for (let i = element.children.length - 1; i >= 0; i--) { + const child = element.children[i]!; + if (traverseKeyHandlers(child, visitor)) { + return true; + } + } + } + + if (element.keyHooks.length > 0 && visitor(element)) { + return true; + } + + return false; +} /** * Handles key events for a component. * Returns true if the event was handled and should stop propagation. @@ -226,6 +246,15 @@ export function renderComponent(mounted: MountedComponent): ViewElement { * @returns True if event was handled */ export function handleComponentKey(mounted: MountedComponent, event: KeyEvent): boolean { + if (mounted.lastElement) { + const handled = traverseKeyHandlers(mounted.lastElement, (element) => + invokeKeyHooks(element.keyHooks, event), + ); + if (handled) { + return true; + } + } + return invokeKeyHooks(mounted.instance.keyHooks, event); } diff --git a/packages/btuin/tests/layout/renderer.test.ts b/packages/btuin/tests/layout/renderer.test.ts index 5e31f69..2c7d648 100644 --- a/packages/btuin/tests/layout/renderer.test.ts +++ b/packages/btuin/tests/layout/renderer.test.ts @@ -2,7 +2,7 @@ import { describe, expect, test, beforeAll } from "bun:test"; import { renderElement } from "../../src/layout/renderer"; import { layout, initLayoutEngine } from "../../src/layout"; import { Block, Text } from "../../src/view/primitives"; -import { createBuffer, fillRect, drawText } from "@btuin/renderer"; +import { createBuffer } from "@btuin/renderer"; import type { Buffer2D } from "@btuin/renderer"; import { resolveColor } from "@btuin/renderer"; @@ -11,7 +11,8 @@ function bufferToString(buf: Buffer2D): string { let out = ""; for (let r = 0; r < buf.rows; r++) { for (let c = 0; c < buf.cols; c++) { - out += String.fromCodePoint(buf.get(r, c).char.codePointAt(0)!); + const char = buf.get(r, c).char || " "; + out += char; } out += "\n"; } @@ -41,7 +42,7 @@ describe("renderElement", () => { renderElement(root, buffer, layoutMap); // Check if the background was applied - for (let i = 0; i < buffer.cells.length; i++) { + for (let i = 0; i < buffer.codes.length; i++) { expect(buffer.bg[i]).toBe(resolveColor("blue", "bg")); } }); diff --git a/packages/btuin/tests/view/components/component.test.ts b/packages/btuin/tests/view/components/component.test.ts index 8994530..55faffc 100644 --- a/packages/btuin/tests/view/components/component.test.ts +++ b/packages/btuin/tests/view/components/component.test.ts @@ -10,7 +10,7 @@ import { import type { Component, RenderFunction } from "../../../src/view/components/component"; import { onKey } from "../../../src/view/components/lifecycle"; import { ref } from "@btuin/reactivity"; -import { Text } from "../../../src/view/primitives"; +import { Block, Text } from "../../../src/view/primitives"; describe("defineComponent", () => { it("should define a component", () => { @@ -82,6 +82,44 @@ describe("handleComponentKey", () => { expect(keyPressed).toBe("a"); }); + + it("should traverse view hierarchy and honor stopPropagation", () => { + const order: string[] = []; + + const component = defineComponent({ + setup() { + onKey(() => { + order.push("component"); + }); + + const child = Block().onKey(() => { + order.push("child"); + return true; + }); + + const parent = Block(child).onKey(() => { + order.push("parent"); + return true; + }); + + return () => parent; + }, + }); + + const mounted = mountComponent(component); + renderComponent(mounted); + + const handled = handleComponentKey(mounted, { + name: "a", + sequence: "a", + ctrl: false, + meta: false, + shift: false, + }); + + expect(handled).toBe(true); + expect(order).toEqual(["child"]); + }); }); describe("normalizeProps", () => { diff --git a/packages/layout-engine/src/index.ts b/packages/layout-engine/src/index.ts index 049aa7e..df5d827 100644 --- a/packages/layout-engine/src/index.ts +++ b/packages/layout-engine/src/index.ts @@ -12,6 +12,17 @@ type LayoutEngineWasmModule = { let wasmModule: LayoutEngineWasmModule | null = null; let wasmImportPromise: Promise | null = null; +function nowMs(): number { + const p = (globalThis as any).performance; + if (p && typeof p.now === "function") return p.now(); + return Date.now(); +} + +function isPerfEnabled(): boolean { + const env = (globalThis as any).process?.env; + return env?.BTUIN_LAYOUT_ENGINE_PROFILE === "1" || env?.BTUIN_LAYOUT_ENGINE_PROFILE === "true"; +} + async function loadWasmModule(): Promise { if (wasmModule) return wasmModule; if (wasmImportPromise) return wasmImportPromise; @@ -131,11 +142,16 @@ export function computeLayout(root: LayoutInputNode): ComputedLayout { throw new Error("Layout engine module not loaded. Call initLayoutEngine() first."); } + const perfEnabled = isPerfEnabled(); + const t0 = perfEnabled ? nowMs() : 0; + const nodes: BridgeNode[] = []; const elementMap = new Map(); flattenTree(root, nodes, elementMap); + const t1 = perfEnabled ? nowMs() : 0; + let rawResults: any[]; try { rawResults = wasmModule.compute_layout(nodes) as any[]; @@ -143,6 +159,8 @@ export function computeLayout(root: LayoutInputNode): ComputedLayout { throw new Error("Layout computation failed.", { cause }); } + const t2 = perfEnabled ? nowMs() : 0; + const computed: ComputedLayout = {}; rawResults.forEach((res: any, index: number) => { const key = elementMap.get(index); @@ -156,6 +174,14 @@ export function computeLayout(root: LayoutInputNode): ComputedLayout { } }); + const t3 = perfEnabled ? nowMs() : 0; + if (perfEnabled) { + // eslint-disable-next-line no-console + console.log( + `[layout-engine] nodes=${nodes.length} flattenTree=${(t1 - t0).toFixed(3)}ms wasm.compute_layout=${(t2 - t1).toFixed(3)}ms decode=${(t3 - t2).toFixed(3)}ms total=${(t3 - t0).toFixed(3)}ms`, + ); + } + return computed; } diff --git a/packages/reactivity/tests/index.test.ts b/packages/reactivity/tests/index.test.ts deleted file mode 100644 index e69de29..0000000 diff --git a/packages/renderer/src/buffer.ts b/packages/renderer/src/buffer.ts index 52d406e..fa96fdd 100644 --- a/packages/renderer/src/buffer.ts +++ b/packages/renderer/src/buffer.ts @@ -1,11 +1,13 @@ +import { measureGraphemeWidth, segmentGraphemes } from "./grapheme"; + /** * Flat buffer for terminal rendering. * - * Internally stores characters in a flat Uint32Array and color attributes - * in parallel string arrays: - * - cells: UTF-32 code point for each cell (space by default) - * - fg: foreground color (ANSI escape sequence or theme color name) - * - bg: background color (ANSI escape sequence or theme color name) + * Each cell stores: + * - codes: the Unicode code point for single-code-point glyphs (0 on continuation slots) + * - extras: Map for grapheme clusters (multi-code-point glyphs) keyed by cell index + * - widths: the column width (0 indicates a continuation cell) + * - fg/bg: color styles matching current cells * * Index calculation: * index = row * cols + col @@ -13,7 +15,9 @@ export class FlatBuffer { readonly rows: number; readonly cols: number; - readonly cells: Uint32Array; + readonly codes: Uint32Array; + readonly extras: Map; + readonly widths: Uint8Array; readonly fg: (string | undefined)[]; readonly bg: (string | undefined)[]; @@ -21,7 +25,9 @@ export class FlatBuffer { this.rows = rows; this.cols = cols; const size = rows * cols; - this.cells = new Uint32Array(size); + this.codes = new Uint32Array(size); + this.extras = new Map(); + this.widths = new Uint8Array(size); this.fg = Array.from({ length: size }); this.bg = Array.from({ length: size }); this.clear(); @@ -31,7 +37,9 @@ export class FlatBuffer { * Reset all cells to space and clear color attributes. */ clear(): void { - this.cells.fill(32); // ASCII space + this.codes.fill(32); // space + this.extras.clear(); + this.widths.fill(1); this.fg.fill(undefined); this.bg.fill(undefined); } @@ -51,12 +59,29 @@ export class FlatBuffer { if (row < 0 || row >= this.rows) return { char: " ", style: {} }; if (col < 0 || col >= this.cols) return { char: " ", style: {} }; const idx = this.index(row, col); + const width = this.widths[idx] ?? 1; return { - char: String.fromCodePoint(this.cells[idx] ?? 32), + char: width === 0 ? "" : this.glyphStringAtIndex(idx), style: { fg: this.fg[idx], bg: this.bg[idx] }, }; } + glyphStringAtIndex(idx: number): string { + const width = this.widths[idx] ?? 1; + if (width === 0) return ""; + const extra = this.extras.get(idx); + if (extra !== undefined) return extra; + const code = this.codes[idx] ?? 32; + if (code === 0) return " "; + return String.fromCodePoint(code); + } + + glyphKeyAtIndex(idx: number): string | number { + const extra = this.extras.get(idx); + if (extra !== undefined) return extra; + return this.codes[idx] ?? 32; + } + /** * Set a cell's character and (optionally) styling at the given position. * Out-of-bounds writes are safely ignored. @@ -64,9 +89,110 @@ export class FlatBuffer { set(row: number, col: number, ch: string, style?: { fg?: string; bg?: string }): void { if (row < 0 || row >= this.rows) return; if (col < 0 || col >= this.cols) return; + + if (ch.length === 1) { + const code = ch.charCodeAt(0); + if (code <= 0x7f) { + this.writeGlyph(row, col, ch, 1, style); + return; + } + } + + const graphemes = segmentGraphemes(ch); + const glyph = graphemes[0] ?? ch; + const width = Math.max(measureGraphemeWidth(glyph), 1); + this.writeGlyph(row, col, glyph, width, style); + } + + setCodePoint( + row: number, + col: number, + codePoint: number, + style?: { fg?: string; bg?: string }, + ): void { + if (row < 0 || row >= this.rows) return; + if (col < 0 || col >= this.cols) return; + const ch = String.fromCodePoint(codePoint); + this.writeGlyph(row, col, ch, 1, style); + } + + private writeGlyph( + row: number, + col: number, + glyph: string, + width: number, + style?: { fg?: string; bg?: string }, + ) { + if (col < 0 || col >= this.cols || row < 0 || row >= this.rows) return; + if (col + width > this.cols) return; + const idx = this.index(row, col); - this.cells[idx] = ch.codePointAt(0) ?? 32; + if (this.widths[idx] === 0) { + this.clearWideSpan(row, col); + } + this.clearFollowingContinuations(row, col); + const normalized = glyph || " "; + if ([...normalized].length > 1) { + this.extras.set(idx, normalized); + const first = normalized.codePointAt(0) ?? 32; + this.codes[idx] = first; + } else { + this.extras.delete(idx); + this.codes[idx] = normalized.codePointAt(0) ?? 32; + } + this.widths[idx] = width; if (style?.fg !== undefined) this.fg[idx] = style.fg; if (style?.bg !== undefined) this.bg[idx] = style.bg; + + for (let offset = 1; offset < width; offset++) { + const contCol = col + offset; + if (contCol >= this.cols) break; + const contIdx = this.index(row, contCol); + this.extras.delete(contIdx); + this.codes[contIdx] = 0; + this.widths[contIdx] = 0; + if (style?.fg !== undefined) this.fg[contIdx] = style.fg; + if (style?.bg !== undefined) this.bg[contIdx] = style.bg; + } + } + + private clearWideSpan(row: number, col: number) { + let baseCol = col - 1; + let baseIdx = -1; + while (baseCol >= 0) { + const idx = this.index(row, baseCol); + if (this.widths[idx] === 0) { + baseCol--; + continue; + } + baseIdx = idx; + break; + } + if (baseIdx === -1) return; + const spanWidth = this.widths[baseIdx]; + if (spanWidth === undefined || spanWidth <= 1) return; + const rowStart = baseCol; + for (let offset = 0; offset < spanWidth; offset++) { + const targetIdx = this.index(row, rowStart + offset); + this.extras.delete(targetIdx); + this.codes[targetIdx] = 32; + this.widths[targetIdx] = 1; + this.fg[targetIdx] = undefined; + this.bg[targetIdx] = undefined; + } + } + + private clearFollowingContinuations(row: number, col: number) { + let nextCol = col + 1; + while (nextCol < this.cols) { + const nextIdx = this.index(row, nextCol); + if (this.widths[nextIdx] !== 0) break; + this.extras.delete(nextIdx); + this.codes[nextIdx] = 32; + this.widths[nextIdx] = 1; + this.fg[nextIdx] = undefined; + this.bg[nextIdx] = undefined; + nextCol++; + } } } diff --git a/packages/renderer/src/diff.ts b/packages/renderer/src/diff.ts index b2a4986..dacc229 100644 --- a/packages/renderer/src/diff.ts +++ b/packages/renderer/src/diff.ts @@ -61,16 +61,26 @@ export function renderDiff(prev: Buffer2D, next: Buffer2D, stats?: DiffStats): s const idx = r * cols + c; - const nextCode = next.cells[idx] || 32; - const prevCode = prev.cells[idx] || 32; + const nextWidth = next.widths[idx]; + if (nextWidth === 0) continue; + + const prevWidth = prev.widths[idx] ?? 0; + const nextGlyphKey = next.glyphKeyAtIndex(idx); + const prevGlyphKey = prev.glyphKeyAtIndex(idx); const nextFg = next.fg[idx]; const nextBg = next.bg[idx]; const prevFg = prev.fg[idx]; const prevBg = prev.bg[idx]; - // Force redraw all cells if size changed, otherwise check for differences - if (sizeChanged || nextCode !== prevCode || nextFg !== prevFg || nextBg !== prevBg) { + const needsDraw = + sizeChanged || + prevWidth !== nextWidth || + prevGlyphKey !== nextGlyphKey || + nextFg !== prevFg || + nextBg !== prevBg; + + if (needsDraw) { if (stats) { stats.changedCells++; stats.cursorMoves++; @@ -99,7 +109,7 @@ export function renderDiff(prev: Buffer2D, next: Buffer2D, stats?: DiffStats): s if (stats) stats.bgChanges++; } - out.push(String.fromCodePoint(nextCode)); + out.push(next.glyphStringAtIndex(idx)); } } } diff --git a/packages/renderer/src/grapheme.ts b/packages/renderer/src/grapheme.ts new file mode 100644 index 0000000..4d19dfc --- /dev/null +++ b/packages/renderer/src/grapheme.ts @@ -0,0 +1,102 @@ +const graphemeSegmenter = (() => { + try { + if (typeof Intl !== "undefined" && typeof Intl.Segmenter === "function") { + return new Intl.Segmenter(undefined, { granularity: "grapheme" }); + } + } catch { + /* fall back to manual segmentation */ + } + return null; +})(); + +const COMBINING_RANGES: [number, number][] = [ + [0x0300, 0x036f], + [0x1ab0, 0x1aff], + [0x1dc0, 0x1dff], + [0x20d0, 0x20ff], + [0xfe20, 0xfe2f], + [0x200c, 0x200d], +]; + +const WIDE_RANGES: [number, number][] = [ + [0x1100, 0x115f], + [0x2329, 0x232a], + [0x2e80, 0xa4cf], + [0xac00, 0xd7a3], + [0xf900, 0xfaff], + [0xfe10, 0xfe19], + [0xfe30, 0xfe6f], + [0xff00, 0xff60], + [0xffe0, 0xffe6], + [0x1f300, 0x1f64f], + [0x1f900, 0x1f9ff], + [0x20000, 0x2fffd], + [0x30000, 0x3fffd], +]; + +function inRange(code: number, ranges: [number, number][]): boolean { + for (const [start, end] of ranges) { + if (code >= start && code <= end) { + return true; + } + } + return false; +} + +function isCombining(code: number): boolean { + return inRange(code, COMBINING_RANGES); +} + +function isWide(code: number): boolean { + return inRange(code, WIDE_RANGES); +} + +function isControl(code: number): boolean { + return (code >= 0 && code < 32) || (code >= 0x7f && code < 0xa0); +} + +export function segmentGraphemes(text: string): string[] { + if (!text) return []; + + if (graphemeSegmenter) { + const segments: string[] = []; + for (const segment of graphemeSegmenter.segment(text)) { + if (segment.segment) { + segments.push(segment.segment); + } + } + return segments; + } + + const fallback: string[] = []; + let buffer = ""; + + for (const char of text) { + const code = char.codePointAt(0) ?? 0; + if (buffer && isCombining(code)) { + buffer += char; + continue; + } + if (buffer) { + fallback.push(buffer); + } + buffer = char; + } + + if (buffer) { + fallback.push(buffer); + } + + return fallback; +} + +export function measureGraphemeWidth(cluster: string): number { + for (const char of cluster) { + const code = char.codePointAt(0); + if (code === undefined) continue; + if (isControl(code)) return 0; + if (isCombining(code)) continue; + return isWide(code) ? 2 : 1; + } + return cluster ? 1 : 0; +} diff --git a/packages/renderer/src/grid.ts b/packages/renderer/src/grid.ts index 376d841..f74b1a0 100644 --- a/packages/renderer/src/grid.ts +++ b/packages/renderer/src/grid.ts @@ -2,6 +2,7 @@ import { resolveColor } from "./colors"; import { FlatBuffer } from "./buffer"; import { type Buffer2D } from "./types/buffer"; import type { ColorValue } from "./types/color"; +import { measureGraphemeWidth, segmentGraphemes } from "./grapheme"; /** * Internal helper to compute flat index into a Buffer2D (FlatBuffer). @@ -34,12 +35,17 @@ export function createBuffer(rows: number, cols: number): Buffer2D { * 可能であれば利用箇所側での使用を見直してください。 * * @param buf - The buffer to clone - * @returns A new Buffer2D with copied cells + * @returns A new Buffer2D with copied glyphs and styles */ export function cloneBuffer(buf: Buffer2D): Buffer2D { const copy = new FlatBuffer(buf.rows, buf.cols); - copy.cells.set(buf.cells); - for (let i = 0; i < buf.cells.length; i++) { + copy.codes.set(buf.codes); + copy.extras.clear(); + for (const [idx, glyph] of buf.extras.entries()) { + copy.extras.set(idx, glyph); + } + copy.widths.set(buf.widths); + for (let i = 0; i < copy.fg.length; i++) { copy.fg[i] = buf.fg[i]; copy.bg[i] = buf.bg[i]; } @@ -73,8 +79,7 @@ export function setCell( const idx = indexOf(buf, row, col); if (cell.ch !== undefined) { - const codePoint = cell.ch.codePointAt(0) ?? 32; - buf.cells[idx] = codePoint; + buf.set(row, col, cell.ch); } if (cell.fg !== undefined) { @@ -124,16 +129,55 @@ export function drawText( const fg = style?.fg !== undefined ? resolveColor(style.fg, "fg") : undefined; const bg = style?.bg !== undefined ? resolveColor(style.bg, "bg") : undefined; + const resolvedStyle = hasFg || hasBg ? { fg, bg } : undefined; + // ASCII fast path: + // - Avoid Intl.Segmenter + // - Avoid per-grapheme width calculation + // - Write directly as width=1 code points + let isAscii = true; for (let i = 0; i < text.length; i++) { - const c = col + i; - if (c < 0 || c >= buf.cols) continue; - - const idx = indexOf(buf, row, c); - const ch = text[i] ?? " "; - buf.cells[idx] = ch.codePointAt(0) ?? 32; - if (hasFg) buf.fg[idx] = fg; - if (hasBg) buf.bg[idx] = bg; + if (text.charCodeAt(i) > 0x7f) { + isAscii = false; + break; + } + } + if (isAscii) { + let currentCol = col; + for (let i = 0; i < text.length; i++) { + const code = text.charCodeAt(i); + if (currentCol >= buf.cols) break; + if (currentCol + 1 <= 0) { + currentCol += 1; + continue; + } + if (currentCol < 0) { + currentCol += 1; + continue; + } + buf.setCodePoint(row, currentCol, code, resolvedStyle); + currentCol += 1; + } + return; + } + + const segments = segmentGraphemes(text); + let currentCol = col; + + for (const segment of segments) { + const width = Math.max(measureGraphemeWidth(segment), 1); + if (currentCol >= buf.cols) break; + if (currentCol + width <= 0) { + currentCol += width; + continue; + } + if (currentCol < 0) { + currentCol += width; + continue; + } + + buf.set(row, currentCol, segment, resolvedStyle); + currentCol += width; } } @@ -179,8 +223,15 @@ export function fillRect( const fg = style?.fg !== undefined ? resolveColor(style.fg, "fg") : undefined; const bg = style?.bg !== undefined ? resolveColor(style.bg, "bg") : undefined; - - const chCode = char.codePointAt(0) ?? 32; + const resolvedStyle = hasFg || hasBg ? { fg, bg } : undefined; + + let fillGlyph = " "; + if (char.length === 1 && char.charCodeAt(0) <= 0x7f) { + fillGlyph = char; + } else { + const cluster = segmentGraphemes(char)[0] ?? char; + fillGlyph = measureGraphemeWidth(cluster) > 1 ? " " : cluster; + } const maxRow = Math.min(buf.rows, row + height); const maxCol = Math.min(buf.cols, col + width); @@ -188,7 +239,7 @@ export function fillRect( for (let r = Math.max(0, row); r < maxRow; r++) { for (let c = Math.max(0, col); c < maxCol; c++) { const idx = indexOf(buf, r, c); - buf.cells[idx] = chCode; + buf.set(r, c, fillGlyph, resolvedStyle); if (hasFg) buf.fg[idx] = fg; if (hasBg) buf.bg[idx] = bg; } diff --git a/packages/renderer/tests/buffer.test.ts b/packages/renderer/tests/buffer.test.ts index f151ad7..78b4038 100644 --- a/packages/renderer/tests/buffer.test.ts +++ b/packages/renderer/tests/buffer.test.ts @@ -10,13 +10,15 @@ describe("FlatBuffer", () => { const buffer = new FlatBuffer(rows, cols); expect(buffer.rows).toBe(rows); expect(buffer.cols).toBe(cols); - expect(buffer.cells.length).toBe(size); + expect(buffer.codes.length).toBe(size); + expect(buffer.widths.length).toBe(size); expect(buffer.fg.length).toBe(size); expect(buffer.bg.length).toBe(size); // Check that it's cleared initially for (let i = 0; i < size; i++) { - expect(buffer.cells[i]).toBe(32); // space + expect(buffer.glyphStringAtIndex(i)).toBe(" "); + expect(buffer.widths[i]).toBe(1); expect(buffer.fg[i]).toBeUndefined(); expect(buffer.bg[i]).toBeUndefined(); } @@ -32,16 +34,15 @@ describe("FlatBuffer", () => { it("should clear the buffer", () => { const buffer = new FlatBuffer(rows, cols); - // Modify the buffer const idx = buffer.index(2, 2); - buffer.cells[idx] = "X".codePointAt(0)!; + buffer.set(2, 2, "X"); buffer.fg[idx] = "red"; buffer.bg[idx] = "blue"; buffer.clear(); - // Check if it's reset - expect(buffer.cells[idx]).toBe(32); + expect(buffer.glyphStringAtIndex(idx)).toBe(" "); + expect(buffer.widths[idx]).toBe(1); expect(buffer.fg[idx]).toBeUndefined(); expect(buffer.bg[idx]).toBeUndefined(); }); diff --git a/packages/renderer/tests/diff.test.ts b/packages/renderer/tests/diff.test.ts index 6bf9096..4e5d199 100644 --- a/packages/renderer/tests/diff.test.ts +++ b/packages/renderer/tests/diff.test.ts @@ -4,6 +4,12 @@ import { FlatBuffer } from "../src/buffer"; import type { Buffer2D } from "../src/types"; import type { DiffStats } from "../src/diff"; +function setCharAt(buf: Buffer2D, idx: number, ch: string) { + const row = Math.floor(idx / buf.cols); + const col = idx % buf.cols; + buf.set(row, col, ch); +} + // Helper to create a mock buffer function createMockBuffer( rows: number, @@ -12,13 +18,14 @@ function createMockBuffer( fg?: string, bg?: string, ): Buffer2D { - const size = rows * cols; const buf = new FlatBuffer(rows, cols); - buf.cells.fill(fillChar.codePointAt(0)!); + for (let r = 0; r < rows; r++) { + for (let c = 0; c < cols; c++) { + buf.set(r, c, fillChar); + } + } buf.fg.fill(fg); buf.bg.fill(bg); - // keep lint/ts happy with unused local - void size; return buf; } @@ -35,7 +42,7 @@ describe("renderDiff", () => { it("should render only the changed cells", () => { const prev = createMockBuffer(2, 2, "a"); const next = createMockBuffer(2, 2, "a"); - next.cells[2] = "b".codePointAt(0)!; // Change one cell + setCharAt(next, 2, "b"); next.fg[2] = "\x1b[31m"; // red const output = renderDiff(prev, next); @@ -67,7 +74,10 @@ describe("renderDiff", () => { it("should batch color changes", () => { const prev = createMockBuffer(1, 5, " "); const next = createMockBuffer(1, 5, " "); - next.cells.set([..."abcd "].map((c) => c.codePointAt(0)!)); + const message = "abcd "; + for (let i = 0; i < message.length; i++) { + setCharAt(next, i, message[i] ?? " "); + } next.fg.fill("\x1b[32m", 0, 2); // green for 'a' and 'b' next.fg.fill("\x1b[34m", 2, 4); // blue for 'c' and 'd' @@ -83,9 +93,9 @@ describe("renderDiff", () => { it("should reset colors when necessary", () => { const prev = createMockBuffer(1, 3, " "); const next = createMockBuffer(1, 3, " "); - next.cells[0] = "a".codePointAt(0)!; + setCharAt(next, 0, "a"); next.fg[0] = "\x1b[31m"; // red - next.cells[1] = "b".codePointAt(0)!; + setCharAt(next, 1, "b"); // next.fg[1] is undefined const output = renderDiff(prev, next); @@ -102,11 +112,11 @@ describe("renderDiff", () => { const prev = createMockBuffer(2, 2, " "); const next = createMockBuffer(2, 2, " "); - next.cells[0] = "A".codePointAt(0)!; + setCharAt(next, 0, "A"); next.fg[0] = "\x1b[31m"; - next.cells[1] = "B".codePointAt(0)!; + setCharAt(next, 1, "B"); next.fg[1] = "\x1b[31m"; - next.cells[2] = "C".codePointAt(0)!; + setCharAt(next, 2, "C"); next.fg[2] = "\x1b[32m"; const stats: DiffStats = { diff --git a/packages/renderer/tests/grapheme.test.ts b/packages/renderer/tests/grapheme.test.ts new file mode 100644 index 0000000..9a7930d --- /dev/null +++ b/packages/renderer/tests/grapheme.test.ts @@ -0,0 +1,31 @@ +import { describe, expect, it } from "bun:test"; +import { segmentGraphemes, measureGraphemeWidth } from "../src/grapheme"; + +describe("grapheme helpers", () => { + it("segments ascii and combining sequences", () => { + const text = "a\u0301b"; + const segments = segmentGraphemes(text); + expect(segments).toEqual(["a\u0301", "b"]); + }); + + it("handles Kanji as two width", () => { + const kanji = "饅"; + const segments = segmentGraphemes(kanji); + expect(measureGraphemeWidth(segments[0]!)).toBe(2); + }); + + it("handles emoji sequences as single graphemes", () => { + const emoji = "👨‍👩‍👧‍👦"; + const segments = segmentGraphemes(emoji); + expect(segments[0]?.startsWith("👨")).toBe(true); + expect(measureGraphemeWidth(segments[0]!)).toBe(2); + }); + + it("measures control characters as zero width", () => { + expect(measureGraphemeWidth("\u0007")).toBe(0); + }); + + it("reports width 1 for normal latin glyphs", () => { + expect(measureGraphemeWidth("A")).toBe(1); + }); +}); diff --git a/packages/renderer/tests/grid.test.ts b/packages/renderer/tests/grid.test.ts index 6521bb9..154d395 100644 --- a/packages/renderer/tests/grid.test.ts +++ b/packages/renderer/tests/grid.test.ts @@ -6,14 +6,14 @@ describe("@btuin/renderer grid", () => { const buf = createBuffer(3, 3); fillRect(buf, 0.9, 0.9, 2.9, 1.9, "X"); - expect(String.fromCodePoint(buf.cells[buf.index(0, 0)]!)).toBe("X"); - expect(String.fromCodePoint(buf.cells[buf.index(0, 1)]!)).toBe("X"); - expect(String.fromCodePoint(buf.cells[buf.index(0, 2)]!)).toBe(" "); + expect(buf.get(0, 0).char).toBe("X"); + expect(buf.get(0, 1).char).toBe("X"); + expect(buf.get(0, 2).char).toBe(" "); }); test("drawText floors non-integer coordinates", () => { const buf = createBuffer(2, 4); drawText(buf, 0.2, 1.8, "A"); - expect(String.fromCodePoint(buf.cells[buf.index(0, 1)]!)).toBe("A"); + expect(buf.get(0, 1).char).toBe("A"); }); }); diff --git a/packages/terminal/tests/index.test.ts b/packages/terminal/tests/index.test.ts deleted file mode 100644 index e69de29..0000000 diff --git a/profiles/layout-1765733911613.json b/profiles/layout-1765733911613.json deleted file mode 100644 index e2ceb68..0000000 --- a/profiles/layout-1765733911613.json +++ /dev/null @@ -1,3022 +0,0 @@ -{ - "version": 1, - "startedAt": "2025-12-14T17:38:31.613Z", - "endedAt": "2025-12-14T17:38:37.237Z", - "frames": [ - { - "id": 1, - "time": 1765733911622, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1428, - "diffCellsChanged": 181, - "diffOps": 184, - "diffCursorMoves": 181, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 50.84525000000001, - "renderMs": 2.913250000000005, - "diffMs": 0.4022500000000093, - "writeMs": 0.00895900000000438, - "frameMs": 54.4745, - "memory": { - "rss": 169099264, - "heapTotal": 16390144, - "heapUsed": 38110773, - "external": 49647198 - } - }, - { - "id": 2, - "time": 1765733911679, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2199, - "diffCellsChanged": 277, - "diffOps": 280, - "diffCursorMoves": 277, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 45.371166, - "renderMs": 7.460667000000001, - "diffMs": 0.1640000000000157, - "writeMs": 0.0016250000000184173, - "frameMs": 53.027584000000004, - "memory": { - "rss": 229064704, - "heapTotal": 33859584, - "heapUsed": 60780847, - "external": 49825423 - } - }, - { - "id": 3, - "time": 1765733911734, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1426, - "diffCellsChanged": 178, - "diffOps": 181, - "diffCursorMoves": 178, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 44.372083, - "renderMs": 0.7922090000000139, - "diffMs": 0.10650000000001114, - "writeMs": 0.0015840000000082455, - "frameMs": 45.290291999999994, - "memory": { - "rss": 233390080, - "heapTotal": 34465792, - "heapUsed": 62974778, - "external": 50125610 - } - }, - { - "id": 4, - "time": 1765733911780, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1427, - "diffCellsChanged": 179, - "diffOps": 182, - "diffCursorMoves": 179, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 41.371791, - "renderMs": 5.653292000000022, - "diffMs": 0.12954099999998903, - "writeMs": 0.0005419999999958236, - "frameMs": 47.18195800000001, - "memory": { - "rss": 258932736, - "heapTotal": 48048128, - "heapUsed": 62974778, - "external": 50125610 - } - }, - { - "id": 5, - "time": 1765733911828, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2020, - "diffCellsChanged": 254, - "diffOps": 257, - "diffCursorMoves": 254, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 44.128083000000004, - "renderMs": 0.8041249999999991, - "diffMs": 0.11908400000004349, - "writeMs": 0.0004999999999881766, - "frameMs": 45.06766700000003, - "memory": { - "rss": 259604480, - "heapTotal": 48048128, - "heapUsed": 65071990, - "external": 50371782 - } - }, - { - "id": 6, - "time": 1765733911874, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2151, - "diffCellsChanged": 270, - "diffOps": 273, - "diffCursorMoves": 270, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 40.94958299999996, - "renderMs": 4.998874999999998, - "diffMs": 0.11045799999999417, - "writeMs": 0.0004160000000297259, - "frameMs": 46.076707999999996, - "memory": { - "rss": 263012352, - "heapTotal": 49915904, - "heapUsed": 65071990, - "external": 50371782 - } - }, - { - "id": 7, - "time": 1765733911922, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1480, - "diffCellsChanged": 185, - "diffOps": 188, - "diffCursorMoves": 185, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 44.164083000000005, - "renderMs": 0.6298329999999623, - "diffMs": 0.1309999999999718, - "writeMs": 0.0004999999999881766, - "frameMs": 44.943250000000035, - "memory": { - "rss": 263487488, - "heapTotal": 49915904, - "heapUsed": 67152908, - "external": 50602540 - } - }, - { - "id": 8, - "time": 1765733911967, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1419, - "diffCellsChanged": 178, - "diffOps": 181, - "diffCursorMoves": 178, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 40.07062500000001, - "renderMs": 4.726832999999999, - "diffMs": 0.18537500000002183, - "writeMs": 0.00037500000001955414, - "frameMs": 44.99908300000004, - "memory": { - "rss": 264847360, - "heapTotal": 51226624, - "heapUsed": 67152908, - "external": 50602540 - } - }, - { - "id": 9, - "time": 1765733912014, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1981, - "diffCellsChanged": 248, - "diffOps": 251, - "diffCursorMoves": 248, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 43.41087500000003, - "renderMs": 0.6931670000000167, - "diffMs": 0.12958400000002257, - "writeMs": 0.0013749999999959073, - "frameMs": 44.287082999999996, - "memory": { - "rss": 264863744, - "heapTotal": 51226624, - "heapUsed": 69251842, - "external": 50842258 - } - }, - { - "id": 10, - "time": 1765733912058, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2146, - "diffCellsChanged": 269, - "diffOps": 272, - "diffCursorMoves": 269, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 40.17462499999999, - "renderMs": 4.8250000000000455, - "diffMs": 0.16945799999996325, - "writeMs": 0.00037500000001955414, - "frameMs": 45.19304199999999, - "memory": { - "rss": 268517376, - "heapTotal": 54388736, - "heapUsed": 69251842, - "external": 50842258 - } - }, - { - "id": 11, - "time": 1765733912105, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1433, - "diffCellsChanged": 179, - "diffOps": 182, - "diffCursorMoves": 179, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 47.628333, - "renderMs": 0.6399579999999787, - "diffMs": 0.13999999999998636, - "writeMs": 0.00041699999997035775, - "frameMs": 48.423583000000065, - "memory": { - "rss": 268517376, - "heapTotal": 54388736, - "heapUsed": 71305115, - "external": 51046347 - } - }, - { - "id": 12, - "time": 1765733912154, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1422, - "diffCellsChanged": 178, - "diffOps": 181, - "diffCursorMoves": 178, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 40.968166, - "renderMs": 4.736666000000014, - "diffMs": 0.1306250000000091, - "writeMs": 0.00024999999993724487, - "frameMs": 45.85141699999997, - "memory": { - "rss": 270483456, - "heapTotal": 56092672, - "heapUsed": 71305115, - "external": 51046347 - } - }, - { - "id": 13, - "time": 1765733912201, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2113, - "diffCellsChanged": 266, - "diffOps": 269, - "diffCursorMoves": 266, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 45.583582999999976, - "renderMs": 0.7534160000000156, - "diffMs": 0.14333299999998417, - "writeMs": 0.00029200000005857873, - "frameMs": 46.495000000000005, - "memory": { - "rss": 270499840, - "heapTotal": 56092672, - "heapUsed": 73356476, - "external": 51249004 - } - }, - { - "id": 14, - "time": 1765733912248, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2215, - "diffCellsChanged": 279, - "diffOps": 282, - "diffCursorMoves": 279, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 40.67420900000002, - "renderMs": 5.06254100000001, - "diffMs": 0.14404100000001563, - "writeMs": 0.0002919999999448919, - "frameMs": 45.90204199999994, - "memory": { - "rss": 272793600, - "heapTotal": 57976832, - "heapUsed": 73356476, - "external": 51249004 - } - }, - { - "id": 15, - "time": 1765733912296, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1434, - "diffCellsChanged": 179, - "diffOps": 182, - "diffCursorMoves": 179, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 43.886708, - "renderMs": 0.6787500000000364, - "diffMs": 0.11275000000000546, - "writeMs": 0.0003330000000687505, - "frameMs": 44.707374999999956, - "memory": { - "rss": 273104896, - "heapTotal": 57976832, - "heapUsed": 75410293, - "external": 51453861 - } - }, - { - "id": 16, - "time": 1765733912341, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1435, - "diffCellsChanged": 180, - "diffOps": 183, - "diffCursorMoves": 180, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 38.92845799999998, - "renderMs": 4.894333999999958, - "diffMs": 0.14387500000009368, - "writeMs": 0.00045799999998052954, - "frameMs": 43.985124999999925, - "memory": { - "rss": 274857984, - "heapTotal": 59664384, - "heapUsed": 75410293, - "external": 51453861 - } - }, - { - "id": 17, - "time": 1765733912386, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2028, - "diffCellsChanged": 255, - "diffOps": 258, - "diffCursorMoves": 255, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 43.2879999999999, - "renderMs": 0.7509999999999764, - "diffMs": 0.1306250000000091, - "writeMs": 0.0005409999999983484, - "frameMs": 44.19854200000009, - "memory": { - "rss": 274857984, - "heapTotal": 59664384, - "heapUsed": 77461054, - "external": 51656142 - } - }, - { - "id": 18, - "time": 1765733912431, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2167, - "diffCellsChanged": 272, - "diffOps": 275, - "diffCursorMoves": 272, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 39.05087500000002, - "renderMs": 5.158500000000004, - "diffMs": 0.1482499999999618, - "writeMs": 0.00037500000007639755, - "frameMs": 44.396499999999946, - "memory": { - "rss": 277200896, - "heapTotal": 61663232, - "heapUsed": 77461054, - "external": 51656142 - } - }, - { - "id": 19, - "time": 1765733912477, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1496, - "diffCellsChanged": 187, - "diffOps": 190, - "diffCursorMoves": 187, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 43.72779200000002, - "renderMs": 0.6473750000000109, - "diffMs": 0.13283300000000509, - "writeMs": 0.0004589999999780048, - "frameMs": 44.522042000000056, - "memory": { - "rss": 277692416, - "heapTotal": 61663232, - "heapUsed": 79512399, - "external": 51858511 - } - }, - { - "id": 20, - "time": 1765733912522, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1427, - "diffCellsChanged": 179, - "diffOps": 182, - "diffCursorMoves": 179, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 40.662207999999964, - "renderMs": 5.023500000000013, - "diffMs": 0.14504199999998946, - "writeMs": 0.00024999999993724487, - "frameMs": 45.84512499999994, - "memory": { - "rss": 279412736, - "heapTotal": 63449088, - "heapUsed": 79512399, - "external": 51858511 - } - }, - { - "id": 21, - "time": 1765733912569, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1989, - "diffCellsChanged": 249, - "diffOps": 252, - "diffCursorMoves": 249, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 43.28724999999997, - "renderMs": 0.7118340000000671, - "diffMs": 0.12808399999994435, - "writeMs": 0.00033400000006622577, - "frameMs": 44.141917000000035, - "memory": { - "rss": 279429120, - "heapTotal": 63449088, - "heapUsed": 81563608, - "external": 52060792 - } - }, - { - "id": 22, - "time": 1765733912615, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2162, - "diffCellsChanged": 271, - "diffOps": 274, - "diffCursorMoves": 271, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 39.4921250000001, - "renderMs": 4.923500000000104, - "diffMs": 0.1306250000000091, - "writeMs": 0.00041699999997035775, - "frameMs": 44.564500000000066, - "memory": { - "rss": 279658496, - "heapTotal": 63449088, - "heapUsed": 83614993, - "external": 52263073 - } - }, - { - "id": 23, - "time": 1765733912660, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1441, - "diffCellsChanged": 180, - "diffOps": 183, - "diffCursorMoves": 180, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 43.36999999999989, - "renderMs": 0.6962909999999738, - "diffMs": 0.1207080000001497, - "writeMs": 0.00037500000007639755, - "frameMs": 44.200582999999824, - "memory": { - "rss": 279855104, - "heapTotal": 63449088, - "heapUsed": 85667756, - "external": 52467516 - } - }, - { - "id": 24, - "time": 1765733912705, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1422, - "diffCellsChanged": 178, - "diffOps": 181, - "diffCursorMoves": 178, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 43.8832910000001, - "renderMs": 5.5001250000000255, - "diffMs": 0.13020800000003874, - "writeMs": 0.00041699999997035775, - "frameMs": 49.53183400000012, - "memory": { - "rss": 286015488, - "heapTotal": 69052416, - "heapUsed": 85667756, - "external": 52467516 - } - }, - { - "id": 25, - "time": 1765733912756, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2113, - "diffCellsChanged": 266, - "diffOps": 269, - "diffCursorMoves": 266, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 44.12937500000021, - "renderMs": 0.8034999999999854, - "diffMs": 0.1300420000000031, - "writeMs": 0.0002919999999448919, - "frameMs": 45.0787499999999, - "memory": { - "rss": 286015488, - "heapTotal": 69052416, - "heapUsed": 87718517, - "external": 52669797 - } - }, - { - "id": 26, - "time": 1765733912802, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2215, - "diffCellsChanged": 279, - "diffOps": 282, - "diffCursorMoves": 279, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 40.54495799999995, - "renderMs": 4.776624999999967, - "diffMs": 0.13412500000004002, - "writeMs": 0.00037500000007639755, - "frameMs": 45.470666000000165, - "memory": { - "rss": 288194560, - "heapTotal": 70871040, - "heapUsed": 87718517, - "external": 52669797 - } - }, - { - "id": 27, - "time": 1765733912849, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1434, - "diffCellsChanged": 179, - "diffOps": 182, - "diffCursorMoves": 179, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 43.522290999999996, - "renderMs": 0.8103750000000218, - "diffMs": 0.12154199999986304, - "writeMs": 0.00045899999986431794, - "frameMs": 44.468832999999904, - "memory": { - "rss": 288210944, - "heapTotal": 70871040, - "heapUsed": 89770246, - "external": 52872566 - } - }, - { - "id": 28, - "time": 1765733912894, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1435, - "diffCellsChanged": 180, - "diffOps": 183, - "diffCursorMoves": 180, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 39.74262500000009, - "renderMs": 5.026082999999971, - "diffMs": 0.13029200000005403, - "writeMs": 0.00045799999998052954, - "frameMs": 44.91212500000006, - "memory": { - "rss": 290226176, - "heapTotal": 72558592, - "heapUsed": 89770246, - "external": 52872566 - } - }, - { - "id": 29, - "time": 1765733912941, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2028, - "diffCellsChanged": 255, - "diffOps": 258, - "diffCursorMoves": 255, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 44.77970800000003, - "renderMs": 0.5829169999999522, - "diffMs": 0.13145800000006602, - "writeMs": 0.0002919999999448919, - "frameMs": 45.510125000000016, - "memory": { - "rss": 290750464, - "heapTotal": 72557568, - "heapUsed": 91823807, - "external": 49948250 - } - }, - { - "id": 30, - "time": 1765733912987, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2167, - "diffCellsChanged": 272, - "diffOps": 275, - "diffCursorMoves": 272, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 39.924666000000116, - "renderMs": 4.774208000000044, - "diffMs": 0.13970900000003894, - "writeMs": 0.0002910000000611035, - "frameMs": 44.851874999999836, - "memory": { - "rss": 291405824, - "heapTotal": 72557568, - "heapUsed": 91823807, - "external": 49948250 - } - }, - { - "id": 31, - "time": 1765733913033, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1496, - "diffCellsChanged": 187, - "diffOps": 190, - "diffCursorMoves": 187, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 42.015499999999975, - "renderMs": 0.5000420000001213, - "diffMs": 0.12983299999996234, - "writeMs": 0.00045899999986431794, - "frameMs": 42.659042, - "memory": { - "rss": 291454976, - "heapTotal": 72557568, - "heapUsed": 56924036, - "external": 50152356 - } - }, - { - "id": 32, - "time": 1765733913077, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1427, - "diffCellsChanged": 179, - "diffOps": 182, - "diffCursorMoves": 179, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 38.53337499999998, - "renderMs": 4.741292000000158, - "diffMs": 0.1270830000000842, - "writeMs": 0.0003749999998490239, - "frameMs": 43.41783299999997, - "memory": { - "rss": 291454976, - "heapTotal": 72557568, - "heapUsed": 58975044, - "external": 50355092 - } - }, - { - "id": 33, - "time": 1765733913121, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1989, - "diffCellsChanged": 249, - "diffOps": 252, - "diffCursorMoves": 249, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 42.3019589999999, - "renderMs": 0.6761659999999665, - "diffMs": 0.12770799999998417, - "writeMs": 0.00024999999982355803, - "frameMs": 43.127709000000095, - "memory": { - "rss": 291454976, - "heapTotal": 72557568, - "heapUsed": 61026254, - "external": 50557598 - } - }, - { - "id": 34, - "time": 1765733913165, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2162, - "diffCellsChanged": 271, - "diffOps": 274, - "diffCursorMoves": 271, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 39.36566599999992, - "renderMs": 4.698499999999967, - "diffMs": 0.1489169999999831, - "writeMs": 0.001040999999986525, - "frameMs": 44.2338749999999, - "memory": { - "rss": 291520512, - "heapTotal": 72557568, - "heapUsed": 61026254, - "external": 50557598 - } - }, - { - "id": 35, - "time": 1765733913211, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1441, - "diffCellsChanged": 180, - "diffOps": 183, - "diffCursorMoves": 180, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 42.84004200000004, - "renderMs": 0.6319999999998345, - "diffMs": 0.12245800000005147, - "writeMs": 0.0005419999999958236, - "frameMs": 43.63912500000015, - "memory": { - "rss": 291520512, - "heapTotal": 72557568, - "heapUsed": 63077271, - "external": 50759879 - } - }, - { - "id": 36, - "time": 1765733913255, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1422, - "diffCellsChanged": 178, - "diffOps": 181, - "diffCursorMoves": 178, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 39.16516699999988, - "renderMs": 4.674333000000161, - "diffMs": 0.12866600000006656, - "writeMs": 0.0004999999998744897, - "frameMs": 44.01616700000022, - "memory": { - "rss": 291520512, - "heapTotal": 72557568, - "heapUsed": 63077271, - "external": 50759879 - } - }, - { - "id": 37, - "time": 1765733913301, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2113, - "diffCellsChanged": 266, - "diffOps": 269, - "diffCursorMoves": 266, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 43.57937500000003, - "renderMs": 0.7215409999998883, - "diffMs": 0.14516699999990124, - "writeMs": 0.0017920000000231084, - "frameMs": 44.472667, - "memory": { - "rss": 291553280, - "heapTotal": 72557568, - "heapUsed": 65132702, - "external": 50964622 - } - }, - { - "id": 38, - "time": 1765733913346, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2215, - "diffCellsChanged": 279, - "diffOps": 282, - "diffCursorMoves": 279, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 40.18595899999991, - "renderMs": 4.8205420000001595, - "diffMs": 0.13116700000000492, - "writeMs": 0.00041699999997035775, - "frameMs": 45.155042000000094, - "memory": { - "rss": 291553280, - "heapTotal": 72557568, - "heapUsed": 65132702, - "external": 50964622 - } - }, - { - "id": 39, - "time": 1765733913392, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1434, - "diffCellsChanged": 179, - "diffOps": 182, - "diffCursorMoves": 179, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 43.55758300000002, - "renderMs": 0.627292000000125, - "diffMs": 0.1143329999999878, - "writeMs": 0.00041699999997035775, - "frameMs": 44.313041999999996, - "memory": { - "rss": 291569664, - "heapTotal": 72557568, - "heapUsed": 67183815, - "external": 51166903 - } - }, - { - "id": 40, - "time": 1765733913437, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1435, - "diffCellsChanged": 180, - "diffOps": 183, - "diffCursorMoves": 180, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 40.39562500000011, - "renderMs": 5.001208000000133, - "diffMs": 0.1388329999999769, - "writeMs": 0.00045799999998052954, - "frameMs": 45.54887499999995, - "memory": { - "rss": 291569664, - "heapTotal": 72557568, - "heapUsed": 67183815, - "external": 51166903 - } - }, - { - "id": 41, - "time": 1765733913484, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2028, - "diffCellsChanged": 255, - "diffOps": 258, - "diffCursorMoves": 255, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 44.84883300000001, - "renderMs": 0.787958000000117, - "diffMs": 0.16762500000004366, - "writeMs": 0.0005830000000059954, - "frameMs": 45.81966599999987, - "memory": { - "rss": 291569664, - "heapTotal": 72557568, - "heapUsed": 69234576, - "external": 51369184 - } - }, - { - "id": 42, - "time": 1765733913530, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2167, - "diffCellsChanged": 272, - "diffOps": 275, - "diffCursorMoves": 272, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 46.96941599999991, - "renderMs": 5.62541699999997, - "diffMs": 0.15495799999985138, - "writeMs": 0.0003339999998388521, - "frameMs": 52.765957999999955, - "memory": { - "rss": 291569664, - "heapTotal": 72557568, - "heapUsed": 69234576, - "external": 51369184 - } - }, - { - "id": 43, - "time": 1765733913585, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1496, - "diffCellsChanged": 187, - "diffOps": 190, - "diffCursorMoves": 187, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 48.81766700000003, - "renderMs": 0.48862499999995634, - "diffMs": 0.12920800000006238, - "writeMs": 0.0005419999999958236, - "frameMs": 49.452166000000034, - "memory": { - "rss": 291569664, - "heapTotal": 72557568, - "heapUsed": 71285593, - "external": 50054800 - } - }, - { - "id": 44, - "time": 1765733913636, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1427, - "diffCellsChanged": 179, - "diffOps": 182, - "diffCursorMoves": 179, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 46.48500000000013, - "renderMs": 5.0229999999996835, - "diffMs": 0.1319579999999405, - "writeMs": 0.0006250000001273293, - "frameMs": 51.65979200000015, - "memory": { - "rss": 291569664, - "heapTotal": 72557568, - "heapUsed": 57037974, - "external": 50260646 - } - }, - { - "id": 45, - "time": 1765733913689, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1989, - "diffCellsChanged": 249, - "diffOps": 252, - "diffCursorMoves": 249, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 44.99225000000024, - "renderMs": 0.7014999999996689, - "diffMs": 0.12670900000011898, - "writeMs": 0.0006669999997939158, - "frameMs": 45.83787500000017, - "memory": { - "rss": 291569664, - "heapTotal": 72557568, - "heapUsed": 59090387, - "external": 50465427 - } - }, - { - "id": 46, - "time": 1765733913735, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2162, - "diffCellsChanged": 271, - "diffOps": 274, - "diffCursorMoves": 271, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 40.39191699999992, - "renderMs": 5.05087500000036, - "diffMs": 0.12704200000007404, - "writeMs": 0.00045799999998052954, - "frameMs": 45.582000000000335, - "memory": { - "rss": 291569664, - "heapTotal": 72557568, - "heapUsed": 59090387, - "external": 50465427 - } - }, - { - "id": 47, - "time": 1765733913782, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1441, - "diffCellsChanged": 180, - "diffOps": 183, - "diffCursorMoves": 180, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 43.493375000000015, - "renderMs": 0.6422919999999976, - "diffMs": 0.12258299999984956, - "writeMs": 0.0005839999998897838, - "frameMs": 44.27691700000014, - "memory": { - "rss": 291569664, - "heapTotal": 72557568, - "heapUsed": 61142707, - "external": 50669011 - } - }, - { - "id": 48, - "time": 1765733913827, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1422, - "diffCellsChanged": 178, - "diffOps": 181, - "diffCursorMoves": 178, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 40.46174999999994, - "renderMs": 4.883416000000125, - "diffMs": 0.129790999999841, - "writeMs": 0.0003749999996216502, - "frameMs": 45.52795799999967, - "memory": { - "rss": 291586048, - "heapTotal": 72557568, - "heapUsed": 61142707, - "external": 50669011 - } - }, - { - "id": 49, - "time": 1765733913874, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2113, - "diffCellsChanged": 266, - "diffOps": 269, - "diffCursorMoves": 266, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 45.36758299999974, - "renderMs": 0.6549589999999625, - "diffMs": 0.14724999999998545, - "writeMs": 0.0005000000001018634, - "frameMs": 46.183708000000024, - "memory": { - "rss": 291586048, - "heapTotal": 72557568, - "heapUsed": 63197012, - "external": 50874388 - } - }, - { - "id": 50, - "time": 1765733913921, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2215, - "diffCellsChanged": 279, - "diffOps": 282, - "diffCursorMoves": 279, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 40.462249999999585, - "renderMs": 4.773083000000042, - "diffMs": 0.14091700000017227, - "writeMs": 0.0004169999997429841, - "frameMs": 45.40391700000009, - "memory": { - "rss": 291586048, - "heapTotal": 72557568, - "heapUsed": 63197012, - "external": 50874388 - } - }, - { - "id": 51, - "time": 1765733913968, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1434, - "diffCellsChanged": 179, - "diffOps": 182, - "diffCursorMoves": 179, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 43.87416600000006, - "renderMs": 0.6018330000001697, - "diffMs": 0.13204099999984464, - "writeMs": 0.00037500000007639755, - "frameMs": 44.638916999999765, - "memory": { - "rss": 291586048, - "heapTotal": 72557568, - "heapUsed": 65249493, - "external": 51077461 - } - }, - { - "id": 52, - "time": 1765733914013, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1435, - "diffCellsChanged": 180, - "diffOps": 183, - "diffCursorMoves": 180, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 40.11824999999999, - "renderMs": 4.903249999999844, - "diffMs": 0.141208000000006, - "writeMs": 0.0005000000001018634, - "frameMs": 45.17599999999993, - "memory": { - "rss": 291586048, - "heapTotal": 72557568, - "heapUsed": 65249493, - "external": 51077461 - } - }, - { - "id": 53, - "time": 1765733914059, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2028, - "diffCellsChanged": 255, - "diffOps": 258, - "diffCursorMoves": 255, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 47.35750000000007, - "renderMs": 0.7036670000002232, - "diffMs": 0.13045899999997346, - "writeMs": 0.0005830000000059954, - "frameMs": 48.20512499999995, - "memory": { - "rss": 291864576, - "heapTotal": 72557568, - "heapUsed": 67303342, - "external": 51281934 - } - }, - { - "id": 54, - "time": 1765733914108, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2167, - "diffCellsChanged": 272, - "diffOps": 275, - "diffCursorMoves": 272, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 40.74866599999996, - "renderMs": 4.90762500000028, - "diffMs": 0.1386250000000473, - "writeMs": 0.0004169999997429841, - "frameMs": 45.806583000000046, - "memory": { - "rss": 291962880, - "heapTotal": 72557568, - "heapUsed": 67303342, - "external": 51281934 - } - }, - { - "id": 55, - "time": 1765733914156, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1496, - "diffCellsChanged": 187, - "diffOps": 190, - "diffCursorMoves": 187, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 43.80074999999988, - "renderMs": 0.6321669999997539, - "diffMs": 0.13149999999995998, - "writeMs": 0.0004169999997429841, - "frameMs": 44.57837500000005, - "memory": { - "rss": 292012032, - "heapTotal": 72557568, - "heapUsed": 69356263, - "external": 51485015 - } - }, - { - "id": 56, - "time": 1765733914201, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1427, - "diffCellsChanged": 179, - "diffOps": 182, - "diffCursorMoves": 179, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 39.77779200000032, - "renderMs": 5.073624999999993, - "diffMs": 0.1220829999997477, - "writeMs": 0.00045899999986431794, - "frameMs": 44.98741700000028, - "memory": { - "rss": 292012032, - "heapTotal": 72557568, - "heapUsed": 69356263, - "external": 51485015 - } - }, - { - "id": 57, - "time": 1765733914247, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1989, - "diffCellsChanged": 249, - "diffOps": 252, - "diffCursorMoves": 249, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 42.982458000000406, - "renderMs": 0.6723339999998643, - "diffMs": 0.12312500000007276, - "writeMs": 0.0005419999997684499, - "frameMs": 43.78941599999962, - "memory": { - "rss": 292012032, - "heapTotal": 72557568, - "heapUsed": 71409824, - "external": 51689872 - } - }, - { - "id": 58, - "time": 1765733914292, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2162, - "diffCellsChanged": 271, - "diffOps": 274, - "diffCursorMoves": 271, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 41.30124999999998, - "renderMs": 4.835708999999952, - "diffMs": 0.13716599999997925, - "writeMs": 0.0005419999997684499, - "frameMs": 46.2907909999999, - "memory": { - "rss": 292012032, - "heapTotal": 72557568, - "heapUsed": 71409824, - "external": 51689872 - } - }, - { - "id": 59, - "time": 1765733914339, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1441, - "diffCellsChanged": 180, - "diffOps": 183, - "diffCursorMoves": 180, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 43.07791600000019, - "renderMs": 0.6048329999998714, - "diffMs": 0.1360420000000886, - "writeMs": 0.0003339999998388521, - "frameMs": 43.831416999999874, - "memory": { - "rss": 292012032, - "heapTotal": 72557568, - "heapUsed": 73460841, - "external": 51892153 - } - }, - { - "id": 60, - "time": 1765733914384, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1422, - "diffCellsChanged": 178, - "diffOps": 181, - "diffCursorMoves": 178, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 39.696249999999964, - "renderMs": 4.81283300000041, - "diffMs": 0.12387500000022555, - "writeMs": 0.0005419999997684499, - "frameMs": 44.64662499999986, - "memory": { - "rss": 292012032, - "heapTotal": 72557568, - "heapUsed": 73460841, - "external": 51892153 - } - }, - { - "id": 61, - "time": 1765733914430, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2113, - "diffCellsChanged": 266, - "diffOps": 269, - "diffCursorMoves": 266, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 42.10029200000008, - "renderMs": 0.6827910000001793, - "diffMs": 0.12841699999989942, - "writeMs": 0.00045799999998052954, - "frameMs": 42.92254099999991, - "memory": { - "rss": 292012032, - "heapTotal": 72557568, - "heapUsed": 75511602, - "external": 52094434 - } - }, - { - "id": 62, - "time": 1765733914473, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2215, - "diffCellsChanged": 279, - "diffOps": 282, - "diffCursorMoves": 279, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 39.83899999999994, - "renderMs": 4.704000000000178, - "diffMs": 0.12212499999986903, - "writeMs": 0.00029200000017226557, - "frameMs": 44.67787500000031, - "memory": { - "rss": 292012032, - "heapTotal": 72557568, - "heapUsed": 75511602, - "external": 52094434 - } - }, - { - "id": 63, - "time": 1765733914519, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1434, - "diffCellsChanged": 179, - "diffOps": 182, - "diffCursorMoves": 179, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 42.55354099999977, - "renderMs": 0.6339169999996557, - "diffMs": 0.12108399999988251, - "writeMs": 0.0005830000000059954, - "frameMs": 43.31995800000004, - "memory": { - "rss": 292012032, - "heapTotal": 72557568, - "heapUsed": 77562619, - "external": 52296715 - } - }, - { - "id": 64, - "time": 1765733914563, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1435, - "diffCellsChanged": 180, - "diffOps": 183, - "diffCursorMoves": 180, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 39.26608400000032, - "renderMs": 4.86041699999987, - "diffMs": 0.11720800000011877, - "writeMs": 0.00029100000028847717, - "frameMs": 44.255833000000166, - "memory": { - "rss": 292012032, - "heapTotal": 72557568, - "heapUsed": 77562619, - "external": 52296715 - } - }, - { - "id": 65, - "time": 1765733914609, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2028, - "diffCellsChanged": 255, - "diffOps": 258, - "diffCursorMoves": 255, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 42.35183400000005, - "renderMs": 0.6565000000000509, - "diffMs": 0.1305409999999938, - "writeMs": 0.0004169999997429841, - "frameMs": 43.14958300000035, - "memory": { - "rss": 292028416, - "heapTotal": 72557568, - "heapUsed": 79613380, - "external": 52498996 - } - }, - { - "id": 66, - "time": 1765733914653, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2167, - "diffCellsChanged": 272, - "diffOps": 275, - "diffCursorMoves": 272, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 39.39108400000032, - "renderMs": 5.008874999999989, - "diffMs": 0.1319579999999405, - "writeMs": 0.00029200000017226557, - "frameMs": 44.54350000000022, - "memory": { - "rss": 292028416, - "heapTotal": 72557568, - "heapUsed": 79613380, - "external": 52498996 - } - }, - { - "id": 67, - "time": 1765733914698, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1496, - "diffCellsChanged": 187, - "diffOps": 190, - "diffCursorMoves": 187, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 42.20775000000003, - "renderMs": 0.650000000000091, - "diffMs": 0.13524999999981446, - "writeMs": 0.0005000000001018634, - "frameMs": 43.00387499999988, - "memory": { - "rss": 292028416, - "heapTotal": 72557568, - "heapUsed": 81666037, - "external": 52702693 - } - }, - { - "id": 68, - "time": 1765733914743, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1427, - "diffCellsChanged": 179, - "diffOps": 182, - "diffCursorMoves": 179, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 39.95004199999994, - "renderMs": 4.869916000000103, - "diffMs": 0.1253750000000764, - "writeMs": 0.0006659999999101274, - "frameMs": 44.963042000000314, - "memory": { - "rss": 292028416, - "heapTotal": 72557568, - "heapUsed": 81666037, - "external": 50065367 - } - }, - { - "id": 69, - "time": 1765733914789, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1989, - "diffCellsChanged": 249, - "diffOps": 252, - "diffCursorMoves": 249, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 43.59487500000023, - "renderMs": 0.4855420000003505, - "diffMs": 0.15979199999992488, - "writeMs": 0.0005000000001018634, - "frameMs": 44.251666000000114, - "memory": { - "rss": 292028416, - "heapTotal": 72557568, - "heapUsed": 81666037, - "external": 50065367 - } - }, - { - "id": 70, - "time": 1765733914835, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2162, - "diffCellsChanged": 271, - "diffOps": 274, - "diffCursorMoves": 271, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 38.814124999999876, - "renderMs": 4.986625000000004, - "diffMs": 0.1330420000003869, - "writeMs": 0.0005839999998897838, - "frameMs": 43.94608299999982, - "memory": { - "rss": 292044800, - "heapTotal": 72557568, - "heapUsed": 59101460, - "external": 50473428 - } - }, - { - "id": 71, - "time": 1765733914879, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1441, - "diffCellsChanged": 180, - "diffOps": 183, - "diffCursorMoves": 180, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 42.54545899999994, - "renderMs": 0.39312500000005457, - "diffMs": 0.12341699999979028, - "writeMs": 0.00041599999985919567, - "frameMs": 43.071750000000065, - "memory": { - "rss": 292044800, - "heapTotal": 72557568, - "heapUsed": 59101460, - "external": 50473428 - } - }, - { - "id": 72, - "time": 1765733914923, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1422, - "diffCellsChanged": 178, - "diffOps": 181, - "diffCursorMoves": 178, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 39.14666699999998, - "renderMs": 4.8308750000001055, - "diffMs": 0.12066600000025574, - "writeMs": 0.000792000000274129, - "frameMs": 44.11220800000001, - "memory": { - "rss": 292044800, - "heapTotal": 72557568, - "heapUsed": 61152874, - "external": 50676362 - } - }, - { - "id": 73, - "time": 1765733914968, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2113, - "diffCellsChanged": 266, - "diffOps": 269, - "diffCursorMoves": 266, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 44.047541000000365, - "renderMs": 0.5974999999998545, - "diffMs": 0.13262499999973443, - "writeMs": 0.0004169999997429841, - "frameMs": 44.79012499999999, - "memory": { - "rss": 292044800, - "heapTotal": 72557568, - "heapUsed": 61152874, - "external": 50676362 - } - }, - { - "id": 74, - "time": 1765733915014, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2215, - "diffCellsChanged": 279, - "diffOps": 282, - "diffCursorMoves": 279, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 39.915750000000116, - "renderMs": 5.082957999999962, - "diffMs": 0.13891600000033577, - "writeMs": 0.0003749999996216502, - "frameMs": 45.15220800000043, - "memory": { - "rss": 292044800, - "heapTotal": 72557568, - "heapUsed": 63203937, - "external": 50878689 - } - }, - { - "id": 75, - "time": 1765733915060, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1434, - "diffCellsChanged": 179, - "diffOps": 182, - "diffCursorMoves": 179, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 43.48462500000005, - "renderMs": 0.5834580000000642, - "diffMs": 0.1303330000000642, - "writeMs": 0.0007919999998193816, - "frameMs": 44.21308299999964, - "memory": { - "rss": 292044800, - "heapTotal": 72557568, - "heapUsed": 63203937, - "external": 50878689 - } - }, - { - "id": 76, - "time": 1765733915105, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1435, - "diffCellsChanged": 180, - "diffOps": 183, - "diffCursorMoves": 180, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 40.357084000000214, - "renderMs": 4.973541999999725, - "diffMs": 0.12412499999982174, - "writeMs": 0.0005419999997684499, - "frameMs": 45.46829200000002, - "memory": { - "rss": 292044800, - "heapTotal": 72557568, - "heapUsed": 65254698, - "external": 51080970 - } - }, - { - "id": 77, - "time": 1765733915152, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2028, - "diffCellsChanged": 255, - "diffOps": 258, - "diffCursorMoves": 255, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 44.60816699999987, - "renderMs": 0.6772499999997308, - "diffMs": 0.12858399999959147, - "writeMs": 0.0005419999997684499, - "frameMs": 45.42666700000018, - "memory": { - "rss": 292044800, - "heapTotal": 72557568, - "heapUsed": 65254698, - "external": 51080970 - } - }, - { - "id": 78, - "time": 1765733915198, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2167, - "diffCellsChanged": 272, - "diffOps": 275, - "diffCursorMoves": 272, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 40.65804100000014, - "renderMs": 5.053291000000172, - "diffMs": 0.13379099999974642, - "writeMs": 0.0006250000001273293, - "frameMs": 45.857708, - "memory": { - "rss": 292044800, - "heapTotal": 72557568, - "heapUsed": 67305715, - "external": 51283251 - } - }, - { - "id": 79, - "time": 1765733915245, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1496, - "diffCellsChanged": 187, - "diffOps": 190, - "diffCursorMoves": 187, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 44.18995799999993, - "renderMs": 0.6339579999998932, - "diffMs": 0.12333300000000236, - "writeMs": 0.00016699999969205237, - "frameMs": 44.95870799999966, - "memory": { - "rss": 292044800, - "heapTotal": 72557568, - "heapUsed": 67305715, - "external": 51283251 - } - }, - { - "id": 80, - "time": 1765733915291, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1427, - "diffCellsChanged": 179, - "diffOps": 182, - "diffCursorMoves": 179, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 40.49866599999996, - "renderMs": 4.912416000000121, - "diffMs": 0.12454200000001947, - "writeMs": 0.0003749999996216502, - "frameMs": 45.549790999999914, - "memory": { - "rss": 292044800, - "heapTotal": 72557568, - "heapUsed": 69356476, - "external": 51485532 - } - }, - { - "id": 81, - "time": 1765733915337, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1989, - "diffCellsChanged": 249, - "diffOps": 252, - "diffCursorMoves": 249, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 43.315833999999995, - "renderMs": 0.653791000000183, - "diffMs": 0.12291700000014316, - "writeMs": 0.0004170000001977314, - "frameMs": 44.106292000000394, - "memory": { - "rss": 292044800, - "heapTotal": 72557568, - "heapUsed": 69356476, - "external": 51485532 - } - }, - { - "id": 82, - "time": 1765733915383, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2162, - "diffCellsChanged": 271, - "diffOps": 274, - "diffCursorMoves": 271, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 43.178292000000056, - "renderMs": 5.18466699999999, - "diffMs": 0.1532919999999649, - "writeMs": 0.0005420000002231973, - "frameMs": 48.530665999999655, - "memory": { - "rss": 292405248, - "heapTotal": 72557568, - "heapUsed": 71407493, - "external": 51687813 - } - }, - { - "id": 83, - "time": 1765733915432, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1441, - "diffCellsChanged": 180, - "diffOps": 183, - "diffCursorMoves": 180, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 43.998499999999694, - "renderMs": 0.5540410000003249, - "diffMs": 0.11787499999991269, - "writeMs": 0.0005420000002231973, - "frameMs": 44.683958000000075, - "memory": { - "rss": 292421632, - "heapTotal": 72557568, - "heapUsed": 71407493, - "external": 51687813 - } - }, - { - "id": 84, - "time": 1765733915478, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "diffCellsChanged": 0, - "diffOps": 0, - "diffCursorMoves": 0, - "diffStyleChanges": 0, - "diffResets": 0, - "diffFullRedraw": false, - "layoutMs": 43.91062499999998, - "renderMs": 0.5242499999999382, - "diffMs": 0.11099999999987631, - "writeMs": 0, - "frameMs": 44.55804100000023, - "memory": { - "rss": 292438016, - "heapTotal": 72557568, - "heapUsed": 74078228, - "external": 51905300 - } - }, - { - "id": 85, - "time": 1765733915522, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1422, - "diffCellsChanged": 178, - "diffOps": 181, - "diffCursorMoves": 178, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 39.93712500000038, - "renderMs": 4.707792000000154, - "diffMs": 0.1216669999998885, - "writeMs": 0.00045799999998052954, - "frameMs": 44.78125, - "memory": { - "rss": 292438016, - "heapTotal": 72557568, - "heapUsed": 74078228, - "external": 51905300 - } - }, - { - "id": 86, - "time": 1765733915568, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2113, - "diffCellsChanged": 266, - "diffOps": 269, - "diffCursorMoves": 266, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 43.500082999999904, - "renderMs": 0.5656670000003032, - "diffMs": 0.1380410000001575, - "writeMs": 0.00045799999998052954, - "frameMs": 44.21787499999982, - "memory": { - "rss": 292438016, - "heapTotal": 72557568, - "heapUsed": 74078228, - "external": 50064851 - } - }, - { - "id": 87, - "time": 1765733915613, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2215, - "diffCellsChanged": 279, - "diffOps": 282, - "diffCursorMoves": 279, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 40.480458, - "renderMs": 4.807416999999987, - "diffMs": 0.1483339999999771, - "writeMs": 0.0006249999996725819, - "frameMs": 45.45100000000002, - "memory": { - "rss": 292438016, - "heapTotal": 72557568, - "heapUsed": 57072084, - "external": 50270404 - } - }, - { - "id": 88, - "time": 1765733915659, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1434, - "diffCellsChanged": 179, - "diffOps": 182, - "diffCursorMoves": 179, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 43.117707999999766, - "renderMs": 0.4941660000004049, - "diffMs": 0.13254200000028504, - "writeMs": 0.00033400000029359944, - "frameMs": 43.757958000000144, - "memory": { - "rss": 292438016, - "heapTotal": 72557568, - "heapUsed": 59113956, - "external": 50475316 - } - }, - { - "id": 89, - "time": 1765733915703, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1435, - "diffCellsChanged": 180, - "diffOps": 183, - "diffCursorMoves": 180, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 40.43304199999966, - "renderMs": 4.7939580000002024, - "diffMs": 0.12349999999969441, - "writeMs": 0.0005410000003394089, - "frameMs": 45.3647919999994, - "memory": { - "rss": 292438016, - "heapTotal": 72557568, - "heapUsed": 59113956, - "external": 50475316 - } - }, - { - "id": 90, - "time": 1765733915750, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2028, - "diffCellsChanged": 255, - "diffOps": 258, - "diffCursorMoves": 255, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 46.170875000000706, - "renderMs": 0.5774169999995138, - "diffMs": 0.1367919999993319, - "writeMs": 0.0004169999992882367, - "frameMs": 46.897917000000234, - "memory": { - "rss": 292438016, - "heapTotal": 72557568, - "heapUsed": 61166367, - "external": 50678991 - } - }, - { - "id": 91, - "time": 1765733915797, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2167, - "diffCellsChanged": 272, - "diffOps": 275, - "diffCursorMoves": 272, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 40.34504099999958, - "renderMs": 4.70495899999969, - "diffMs": 0.14279200000055425, - "writeMs": 0.0005419999997684499, - "frameMs": 45.20666700000038, - "memory": { - "rss": 292438016, - "heapTotal": 72557568, - "heapUsed": 61166367, - "external": 50678991 - } - }, - { - "id": 92, - "time": 1765733915843, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1496, - "diffCellsChanged": 187, - "diffOps": 190, - "diffCursorMoves": 187, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 43.055999999999585, - "renderMs": 0.5096669999993537, - "diffMs": 0.12850000000071304, - "writeMs": 0.0003329999999550637, - "frameMs": 43.70600000000013, - "memory": { - "rss": 292438016, - "heapTotal": 72557568, - "heapUsed": 63218372, - "external": 50882516 - } - }, - { - "id": 93, - "time": 1765733915887, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1427, - "diffCellsChanged": 179, - "diffOps": 182, - "diffCursorMoves": 179, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 40.06758400000035, - "renderMs": 4.732124999999542, - "diffMs": 0.13099999999940337, - "writeMs": 0.0007080000004862086, - "frameMs": 44.94987500000025, - "memory": { - "rss": 292438016, - "heapTotal": 72557568, - "heapUsed": 63218372, - "external": 50882516 - } - }, - { - "id": 94, - "time": 1765733915933, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1989, - "diffCellsChanged": 249, - "diffOps": 252, - "diffCursorMoves": 249, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 42.95116700000017, - "renderMs": 0.5744580000000497, - "diffMs": 0.14991700000064156, - "writeMs": 0.0003329999999550637, - "frameMs": 43.68720899999971, - "memory": { - "rss": 292438016, - "heapTotal": 72557568, - "heapUsed": 65269409, - "external": 51084817 - } - }, - { - "id": 95, - "time": 1765733915976, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2162, - "diffCellsChanged": 271, - "diffOps": 274, - "diffCursorMoves": 271, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 40.61537500000031, - "renderMs": 4.6709579999997, - "diffMs": 0.1358749999999418, - "writeMs": 0.0004580000004352769, - "frameMs": 45.43541699999969, - "memory": { - "rss": 292438016, - "heapTotal": 72557568, - "heapUsed": 65269409, - "external": 51084817 - } - }, - { - "id": 96, - "time": 1765733916023, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1441, - "diffCellsChanged": 180, - "diffOps": 183, - "diffCursorMoves": 180, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 47.73400000000038, - "renderMs": 0.4836669999995138, - "diffMs": 0.129041999999572, - "writeMs": 0.0005000000001018634, - "frameMs": 48.362833999999566, - "memory": { - "rss": 292438016, - "heapTotal": 72557568, - "heapUsed": 67320770, - "external": 51287474 - } - }, - { - "id": 97, - "time": 1765733916071, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1422, - "diffCellsChanged": 178, - "diffOps": 181, - "diffCursorMoves": 178, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 41.647375000000466, - "renderMs": 4.619082999999591, - "diffMs": 0.12641700000040146, - "writeMs": 0.0005419999997684499, - "frameMs": 46.4096669999999, - "memory": { - "rss": 292438016, - "heapTotal": 72557568, - "heapUsed": 67320770, - "external": 51287474 - } - }, - { - "id": 98, - "time": 1765733916119, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2113, - "diffCellsChanged": 266, - "diffOps": 269, - "diffCursorMoves": 266, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 42.83241700000053, - "renderMs": 0.5484999999998763, - "diffMs": 0.13079199999992852, - "writeMs": 0.0004579999995257822, - "frameMs": 43.52374999999938, - "memory": { - "rss": 292438016, - "heapTotal": 72557568, - "heapUsed": 69371787, - "external": 50069538 - } - }, - { - "id": 99, - "time": 1765733916163, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2215, - "diffCellsChanged": 279, - "diffOps": 282, - "diffCursorMoves": 279, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 40.11304199999995, - "renderMs": 4.618959000000359, - "diffMs": 0.12954200000058336, - "writeMs": 0.0126669999999649, - "frameMs": 44.88625000000047, - "memory": { - "rss": 292438016, - "heapTotal": 72557568, - "heapUsed": 69371787, - "external": 50069538 - } - }, - { - "id": 100, - "time": 1765733916209, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1434, - "diffCellsChanged": 179, - "diffOps": 182, - "diffCursorMoves": 179, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 43.07920800000011, - "renderMs": 0.49620800000047893, - "diffMs": 0.13166699999965203, - "writeMs": 0.0005830000000059954, - "frameMs": 43.73479099999986, - "memory": { - "rss": 292438016, - "heapTotal": 72557568, - "heapUsed": 57067738, - "external": 50275690 - } - }, - { - "id": 101, - "time": 1765733916253, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1435, - "diffCellsChanged": 180, - "diffOps": 183, - "diffCursorMoves": 180, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 40.336207999999715, - "renderMs": 4.668542000000343, - "diffMs": 0.13258399999995163, - "writeMs": 0.00045899999986431794, - "frameMs": 45.1904999999997, - "memory": { - "rss": 292438016, - "heapTotal": 72557568, - "heapUsed": 57067738, - "external": 50275690 - } - }, - { - "id": 102, - "time": 1765733916299, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2036, - "diffCellsChanged": 256, - "diffOps": 259, - "diffCursorMoves": 256, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 47.840165999999954, - "renderMs": 0.5673340000003009, - "diffMs": 0.1340409999993426, - "writeMs": 0.001291999999921245, - "frameMs": 48.57979199999954, - "memory": { - "rss": 292438016, - "heapTotal": 72557568, - "heapUsed": 59136814, - "external": 50492254 - } - }, - { - "id": 103, - "time": 1765733916348, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2183, - "diffCellsChanged": 274, - "diffOps": 277, - "diffCursorMoves": 274, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 40.20366699999977, - "renderMs": 4.75879199999963, - "diffMs": 0.13137499999993452, - "writeMs": 0.00008300000081362668, - "frameMs": 45.12174999999934, - "memory": { - "rss": 292438016, - "heapTotal": 72557568, - "heapUsed": 59136814, - "external": 50492254 - } - }, - { - "id": 104, - "time": 1765733916394, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1512, - "diffCellsChanged": 189, - "diffOps": 192, - "diffCursorMoves": 189, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 43.04412500000035, - "renderMs": 0.48649999999997817, - "diffMs": 0.13991700000042329, - "writeMs": 0.0002919999997175182, - "frameMs": 43.68291600000066, - "memory": { - "rss": 292438016, - "heapTotal": 72557568, - "heapUsed": 61193880, - "external": 50699944 - } - }, - { - "id": 105, - "time": 1765733916438, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1435, - "diffCellsChanged": 180, - "diffOps": 183, - "diffCursorMoves": 180, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 40.918249999999716, - "renderMs": 4.68854199999987, - "diffMs": 0.14058399999976245, - "writeMs": 0.0001249999995707185, - "frameMs": 45.759500000000116, - "memory": { - "rss": 292438016, - "heapTotal": 72557568, - "heapUsed": 61193880, - "external": 50699944 - } - }, - { - "id": 106, - "time": 1765733916484, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1997, - "diffCellsChanged": 250, - "diffOps": 253, - "diffCursorMoves": 250, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 42.749665999999706, - "renderMs": 0.525166000000354, - "diffMs": 0.12466700000004494, - "writeMs": 0.00004200000057608122, - "frameMs": 43.41150000000016, - "memory": { - "rss": 292438016, - "heapTotal": 72557568, - "heapUsed": 63246579, - "external": 50903907 - } - }, - { - "id": 107, - "time": 1765733916528, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2178, - "diffCellsChanged": 273, - "diffOps": 276, - "diffCursorMoves": 273, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 39.536834000000454, - "renderMs": 4.646083000000544, - "diffMs": 0.13179200000013225, - "writeMs": 0.000249999999141437, - "frameMs": 44.32629100000031, - "memory": { - "rss": 292438016, - "heapTotal": 72557568, - "heapUsed": 63246579, - "external": 50903907 - } - }, - { - "id": 108, - "time": 1765733916573, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1449, - "diffCellsChanged": 181, - "diffOps": 184, - "diffCursorMoves": 181, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 43.022917000000234, - "renderMs": 0.49112499999955617, - "diffMs": 0.13670900000033726, - "writeMs": 0.00016700000014679972, - "frameMs": 43.661833000000115, - "memory": { - "rss": 292438016, - "heapTotal": 72557568, - "heapUsed": 65297341, - "external": 51106189 - } - }, - { - "id": 109, - "time": 1765733916617, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1430, - "diffCellsChanged": 179, - "diffOps": 182, - "diffCursorMoves": 179, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 39.648583000000144, - "renderMs": 4.766999999999825, - "diffMs": 0.13320799999928568, - "writeMs": 0.0002500000000509317, - "frameMs": 44.56066600000031, - "memory": { - "rss": 292438016, - "heapTotal": 72557568, - "heapUsed": 67348583, - "external": 51308471 - } - }, - { - "id": 110, - "time": 1765733916663, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2121, - "diffCellsChanged": 267, - "diffOps": 270, - "diffCursorMoves": 267, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 43.47187500000018, - "renderMs": 0.6000000000003638, - "diffMs": 0.1265000000003056, - "writeMs": 0.0001249999995707185, - "frameMs": 44.208832999999686, - "memory": { - "rss": 292438016, - "heapTotal": 72557568, - "heapUsed": 69400663, - "external": 51512183 - } - }, - { - "id": 111, - "time": 1765733916707, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2231, - "diffCellsChanged": 281, - "diffOps": 284, - "diffCursorMoves": 281, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 38.853667000000314, - "renderMs": 4.597625000000335, - "diffMs": 0.12758299999950395, - "writeMs": 0.00029099999937898247, - "frameMs": 43.59016699999938, - "memory": { - "rss": 292438016, - "heapTotal": 72557568, - "heapUsed": 69400663, - "external": 51512183 - } - }, - { - "id": 112, - "time": 1765733916751, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1442, - "diffCellsChanged": 180, - "diffOps": 183, - "diffCursorMoves": 180, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 42.40825000000041, - "renderMs": 0.49866600000041217, - "diffMs": 0.13625000000047294, - "writeMs": 0.00008299999990413198, - "frameMs": 43.053750000000036, - "memory": { - "rss": 292438016, - "heapTotal": 72557568, - "heapUsed": 71456001, - "external": 51717041 - } - }, - { - "id": 113, - "time": 1765733916795, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1443, - "diffCellsChanged": 181, - "diffOps": 184, - "diffCursorMoves": 181, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 39.73816699999952, - "renderMs": 4.697291999999834, - "diffMs": 0.1226249999999709, - "writeMs": 0.0002920000006270129, - "frameMs": 44.569792000000234, - "memory": { - "rss": 292438016, - "heapTotal": 72557568, - "heapUsed": 71456001, - "external": 51717041 - } - }, - { - "id": 114, - "time": 1765733916840, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2036, - "diffCellsChanged": 256, - "diffOps": 259, - "diffCursorMoves": 256, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 43.484167000000525, - "renderMs": 0.5354589999997188, - "diffMs": 0.12879099999918253, - "writeMs": 0.00008400000024266774, - "frameMs": 44.15899999999965, - "memory": { - "rss": 292438016, - "heapTotal": 72557568, - "heapUsed": 73507019, - "external": 51919323 - } - }, - { - "id": 115, - "time": 1765733916884, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2183, - "diffCellsChanged": 274, - "diffOps": 277, - "diffCursorMoves": 274, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 39.015041999999994, - "renderMs": 4.636792000000241, - "diffMs": 0.1305419999998776, - "writeMs": 0.00016700000014679972, - "frameMs": 43.792875000000095, - "memory": { - "rss": 292438016, - "heapTotal": 72557568, - "heapUsed": 73507019, - "external": 51919323 - } - }, - { - "id": 116, - "time": 1765733916929, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1512, - "diffCellsChanged": 189, - "diffOps": 192, - "diffCursorMoves": 189, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 42.08249999999953, - "renderMs": 0.521708000000217, - "diffMs": 0.11983299999974406, - "writeMs": 0.00004200000057608122, - "frameMs": 42.73216700000012, - "memory": { - "rss": 292438016, - "heapTotal": 72557568, - "heapUsed": 75557781, - "external": 52121605 - } - }, - { - "id": 117, - "time": 1765733916972, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1435, - "diffCellsChanged": 180, - "diffOps": 183, - "diffCursorMoves": 180, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 39.13275000000067, - "renderMs": 4.6444159999991825, - "diffMs": 0.118916999999783, - "writeMs": 0.0001249999995707185, - "frameMs": 43.90558299999975, - "memory": { - "rss": 292438016, - "heapTotal": 72557568, - "heapUsed": 75557781, - "external": 52121605 - } - }, - { - "id": 118, - "time": 1765733917017, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1997, - "diffCellsChanged": 250, - "diffOps": 253, - "diffCursorMoves": 250, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 42.40045800000007, - "renderMs": 0.5571669999999358, - "diffMs": 0.1257500000001528, - "writeMs": 0.00008299999990413198, - "frameMs": 43.09370899999976, - "memory": { - "rss": 292438016, - "heapTotal": 72557568, - "heapUsed": 77608799, - "external": 52323887 - } - }, - { - "id": 119, - "time": 1765733917060, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 2178, - "diffCellsChanged": 273, - "diffOps": 276, - "diffCursorMoves": 273, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 39.384125000000495, - "renderMs": 4.649042000000009, - "diffMs": 0.13887500000055297, - "writeMs": 0.0002500000000509317, - "frameMs": 44.18237500000032, - "memory": { - "rss": 292438016, - "heapTotal": 72557568, - "heapUsed": 77608799, - "external": 52323887 - } - }, - { - "id": 120, - "time": 1765733917105, - "rows": 40, - "cols": 120, - "nodeCount": 8002, - "outputBytes": 1449, - "diffCellsChanged": 181, - "diffOps": 184, - "diffCursorMoves": 181, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 42.50187499999993, - "renderMs": 0.508958000000348, - "diffMs": 0.1172500000002401, - "writeMs": 0.00004200000057608122, - "frameMs": 43.13804199999959, - "memory": { - "rss": 292438016, - "heapTotal": 72557568, - "heapUsed": 79662017, - "external": 49737181 - } - } - ], - "summary": { - "frameCount": 120, - "frameMs": { - "p50": 44.683958000000075, - "p95": 48.57979199999954, - "p99": 52.765957999999955, - "max": 54.4745 - }, - "totals": { - "layoutMs": 5068.675703000005, - "renderMs": 330.06558100000126, - "diffMs": 16.14816799999909, - "writeMs": 0.07530299999626777, - "frameMs": 5417.250871999999 - } - } -} \ No newline at end of file diff --git a/profiles/stress-1765732169537.json b/profiles/stress-1765732169537.json deleted file mode 100644 index e872fc1..0000000 --- a/profiles/stress-1765732169537.json +++ /dev/null @@ -1,3023 +0,0 @@ -{ - "version": 1, - "startedAt": "2025-12-14T17:09:29.539Z", - "endedAt": "2025-12-14T17:09:46.874Z", - "frames": [ - { - "id": 1, - "time": 1765732169547, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 2584, - "diffCellsChanged": 330, - "diffOps": 333, - "diffCursorMoves": 330, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 56.839332999999996, - "renderMs": 92.93191599999999, - "diffMs": 0.4253749999999741, - "writeMs": 0.012334000000009837, - "frameMs": 150.60225, - "memory": { - "rss": 675446784, - "heapTotal": 95998976, - "heapUsed": 36985778, - "external": 85047925 - } - }, - { - "id": 2, - "time": 1765732169699, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 53, - "renderMs": 97.67104099999997, - "diffMs": 0.17024999999995316, - "writeMs": 0.0017500000000154614, - "frameMs": 150.88266599999997, - "memory": { - "rss": 695074816, - "heapTotal": 105964544, - "heapUsed": 97843837, - "external": 85248077 - } - }, - { - "id": 3, - "time": 1765732169851, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 49.826167, - "renderMs": 71.87629199999998, - "diffMs": 0.10654099999999289, - "writeMs": 0.0023329999999646134, - "frameMs": 121.833708, - "memory": { - "rss": 695959552, - "heapTotal": 105948160, - "heapUsed": 97945874, - "external": 85311394 - } - }, - { - "id": 4, - "time": 1765732169973, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 52.54704099999998, - "renderMs": 76.00291599999997, - "diffMs": 0.10608400000000984, - "writeMs": 0.0004999999999881766, - "frameMs": 128.67874999999998, - "memory": { - "rss": 1182236672, - "heapTotal": 185492480, - "heapUsed": 97945874, - "external": 85311394 - } - }, - { - "id": 5, - "time": 1765732170103, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 52.997499999999945, - "renderMs": 71.054125, - "diffMs": 0.08570800000006784, - "writeMs": 0.0013750000000527507, - "frameMs": 124.16187500000001, - "memory": { - "rss": 1182236672, - "heapTotal": 173515776, - "heapUsed": 98401263, - "external": 85748255 - } - }, - { - "id": 6, - "time": 1765732170237, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 49.104832999999985, - "renderMs": 73.396209, - "diffMs": 0.1043329999999969, - "writeMs": 0.0016669999999976426, - "frameMs": 122.62895800000001, - "memory": { - "rss": 1182695424, - "heapTotal": 100803584, - "heapUsed": 98435098, - "external": 85764794 - } - }, - { - "id": 7, - "time": 1765732170370, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 51.99766699999998, - "renderMs": 78.84866599999998, - "diffMs": 0.12358400000005076, - "writeMs": 0.0012909999999237698, - "frameMs": 130.993834, - "memory": { - "rss": 1182728192, - "heapTotal": 99329024, - "heapUsed": 98464265, - "external": 85777065 - } - }, - { - "id": 8, - "time": 1765732170502, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 53.40479200000004, - "renderMs": 86.14154200000007, - "diffMs": 0.1454999999998563, - "writeMs": 0.00045799999998052954, - "frameMs": 139.7137919999999, - "memory": { - "rss": 1182777344, - "heapTotal": 172745728, - "heapUsed": 98464265, - "external": 85777065 - } - }, - { - "id": 9, - "time": 1765732170642, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 48.65375000000017, - "renderMs": 78.95837499999993, - "diffMs": 0.13779100000010658, - "writeMs": 0.0025829999999587017, - "frameMs": 127.79516599999988, - "memory": { - "rss": 1182810112, - "heapTotal": 172745728, - "heapUsed": 98486035, - "external": 85781587 - } - }, - { - "id": 10, - "time": 1765732170770, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 49.23566600000004, - "renderMs": 95.09279199999992, - "diffMs": 0.11441600000011931, - "writeMs": 0.0002500000000509317, - "frameMs": 144.46958300000006, - "memory": { - "rss": 1187037184, - "heapTotal": 172762112, - "heapUsed": 98486035, - "external": 85781587 - } - }, - { - "id": 11, - "time": 1765732170915, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 25, - "diffCellsChanged": 2, - "diffOps": 4, - "diffCursorMoves": 2, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 48.15087500000004, - "renderMs": 75.78079200000002, - "diffMs": 0.11387500000000728, - "writeMs": 0.0005830000000059954, - "frameMs": 124.06679200000008, - "memory": { - "rss": 1187037184, - "heapTotal": 172762112, - "heapUsed": 98509006, - "external": 85786606 - } - }, - { - "id": 12, - "time": 1765732171049, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 49.02254199999993, - "renderMs": 80.25179200000002, - "diffMs": 0.10954099999980826, - "writeMs": 0.0006249999998999556, - "frameMs": 129.40645800000016, - "memory": { - "rss": 1187037184, - "heapTotal": 100836352, - "heapUsed": 98527666, - "external": 85788674 - } - }, - { - "id": 13, - "time": 1765732171190, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 49.04704200000015, - "renderMs": 116.4251670000001, - "diffMs": 0.11783300000001873, - "writeMs": 0.00020900000004075991, - "frameMs": 165.6120840000001, - "memory": { - "rss": 1187053568, - "heapTotal": 99329024, - "heapUsed": 98546326, - "external": 85790742 - } - }, - { - "id": 14, - "time": 1765732171355, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 51.18816600000014, - "renderMs": 111.19158400000015, - "diffMs": 0.11408400000004804, - "writeMs": 0.0002500000000509317, - "frameMs": 162.52229199999988, - "memory": { - "rss": 1187069952, - "heapTotal": 172811264, - "heapUsed": 98546326, - "external": 85790742 - } - }, - { - "id": 15, - "time": 1765732171518, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 50.54500000000007, - "renderMs": 86.61737500000027, - "diffMs": 0.12829199999987395, - "writeMs": 0.0007089999999152496, - "frameMs": 137.33537499999989, - "memory": { - "rss": 1187069952, - "heapTotal": 172811264, - "heapUsed": 98565450, - "external": 85792810 - } - }, - { - "id": 16, - "time": 1765732171666, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 50.80074999999988, - "renderMs": 93.90391700000009, - "diffMs": 0.14179199999989578, - "writeMs": 0.0006250000001273293, - "frameMs": 144.8710000000001, - "memory": { - "rss": 1187086336, - "heapTotal": 100705280, - "heapUsed": 98584246, - "external": 85794966 - } - }, - { - "id": 17, - "time": 1765732171812, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 48.938666999999896, - "renderMs": 87.06466599999976, - "diffMs": 0.1184160000002521, - "writeMs": 0.0007080000000314612, - "frameMs": 136.160167, - "memory": { - "rss": 1187119104, - "heapTotal": 100705280, - "heapUsed": 98602906, - "external": 85797034 - } - }, - { - "id": 18, - "time": 1765732171959, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 52.05891699999984, - "renderMs": 96.0694999999996, - "diffMs": 0.11887499999966167, - "writeMs": 0.00029200000017226557, - "frameMs": 148.28258300000016, - "memory": { - "rss": 1187135488, - "heapTotal": 98968576, - "heapUsed": 98624718, - "external": 85801678 - } - }, - { - "id": 19, - "time": 1765732172118, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 51.32045900000003, - "renderMs": 89.89945799999987, - "diffMs": 0.11045800000010786, - "writeMs": 0.00045899999986431794, - "frameMs": 141.35550000000012, - "memory": { - "rss": 1187135488, - "heapTotal": 97657856, - "heapUsed": 98643706, - "external": 85803834 - } - }, - { - "id": 20, - "time": 1765732172259, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 49.551000000000386, - "renderMs": 94.23833300000024, - "diffMs": 0.12112500000012005, - "writeMs": 0.0005000000001018634, - "frameMs": 143.93358399999988, - "memory": { - "rss": 1187151872, - "heapTotal": 172893184, - "heapUsed": 98643706, - "external": 85803834 - } - }, - { - "id": 21, - "time": 1765732172404, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 25, - "diffCellsChanged": 2, - "diffOps": 4, - "diffCursorMoves": 2, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 49.3472499999998, - "renderMs": 82.93458400000009, - "diffMs": 0.12049999999999272, - "writeMs": 0.0005830000000059954, - "frameMs": 132.42641700000013, - "memory": { - "rss": 1187151872, - "heapTotal": 172893184, - "heapUsed": 98663022, - "external": 85805902 - } - }, - { - "id": 22, - "time": 1765732172547, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 49.34233399999994, - "renderMs": 89.00129199999992, - "diffMs": 0.12208300000020245, - "writeMs": 0.0007500000001527951, - "frameMs": 138.48920799999996, - "memory": { - "rss": 1187151872, - "heapTotal": 100721664, - "heapUsed": 98682074, - "external": 85808058 - } - }, - { - "id": 23, - "time": 1765732172686, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 57.267333000000235, - "renderMs": 81.45850000000019, - "diffMs": 0.10837499999979627, - "writeMs": 0.0006250000001273293, - "frameMs": 138.85520799999995, - "memory": { - "rss": 1187151872, - "heapTotal": 100721664, - "heapUsed": 98700734, - "external": 85810126 - } - }, - { - "id": 24, - "time": 1765732172835, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 49.90666699999974, - "renderMs": 89.26633300000003, - "diffMs": 0.12945899999976973, - "writeMs": 0.0005839999998897838, - "frameMs": 139.32337499999994, - "memory": { - "rss": 1187151872, - "heapTotal": 99050496, - "heapUsed": 98719394, - "external": 85812194 - } - }, - { - "id": 25, - "time": 1765732172985, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 49.574041999999736, - "renderMs": 84.0522920000003, - "diffMs": 0.11608299999988958, - "writeMs": 0.0005420000002231973, - "frameMs": 133.765042, - "memory": { - "rss": 1187151872, - "heapTotal": 97494016, - "heapUsed": 98738054, - "external": 85814262 - } - }, - { - "id": 26, - "time": 1765732173119, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 52.41966700000012, - "renderMs": 97.52729099999988, - "diffMs": 0.12029200000006313, - "writeMs": 0.00029200000017226557, - "frameMs": 150.088209, - "memory": { - "rss": 1187151872, - "heapTotal": 172991488, - "heapUsed": 98738054, - "external": 85814262 - } - }, - { - "id": 27, - "time": 1765732173270, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 49.656124999999975, - "renderMs": 80.90558299999975, - "diffMs": 0.12445900000011534, - "writeMs": 0.0006249999996725819, - "frameMs": 130.71116699999993, - "memory": { - "rss": 1187151872, - "heapTotal": 172991488, - "heapUsed": 98757890, - "external": 85816818 - } - }, - { - "id": 28, - "time": 1765732173411, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 54.71629199999961, - "renderMs": 90.17999999999984, - "diffMs": 0.11995900000010806, - "writeMs": 0.0007080000000314612, - "frameMs": 145.04154100000005, - "memory": { - "rss": 1187151872, - "heapTotal": 100918272, - "heapUsed": 98776550, - "external": 85818886 - } - }, - { - "id": 29, - "time": 1765732173567, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 51.128333000000566, - "renderMs": 86.09250000000065, - "diffMs": 0.118916999999783, - "writeMs": 0.0005410000003394089, - "frameMs": 137.37562499999967, - "memory": { - "rss": 1187151872, - "heapTotal": 99394560, - "heapUsed": 98795346, - "external": 85821042 - } - }, - { - "id": 30, - "time": 1765732173705, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 52.00804200000039, - "renderMs": 102.06758300000001, - "diffMs": 0.13141600000017206, - "writeMs": 0.0003329999999550637, - "frameMs": 154.23008300000038, - "memory": { - "rss": 1187151872, - "heapTotal": 173040640, - "heapUsed": 98795346, - "external": 85821042 - } - }, - { - "id": 31, - "time": 1765732173859, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 25, - "diffCellsChanged": 2, - "diffOps": 4, - "diffCursorMoves": 2, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 49.3402500000002, - "renderMs": 80.53787499999999, - "diffMs": 0.1422920000004524, - "writeMs": 0.00041599999985919567, - "frameMs": 130.04508299999998, - "memory": { - "rss": 1187151872, - "heapTotal": 173040640, - "heapUsed": 98814470, - "external": 85823110 - } - }, - { - "id": 32, - "time": 1765732174000, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 54.20970800000032, - "renderMs": 82.00595799999974, - "diffMs": 0.12120899999990797, - "writeMs": 0.0007909999994808459, - "frameMs": 136.358792, - "memory": { - "rss": 1187151872, - "heapTotal": 100951040, - "heapUsed": 98833130, - "external": 85825178 - } - }, - { - "id": 33, - "time": 1765732174147, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 52.28583299999991, - "renderMs": 81.5590000000002, - "diffMs": 0.10395800000060262, - "writeMs": 0.0007500000001527951, - "frameMs": 133.97429199999988, - "memory": { - "rss": 1187151872, - "heapTotal": 99329024, - "heapUsed": 98852222, - "external": 85827246 - } - }, - { - "id": 34, - "time": 1765732174281, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 52.53495899999962, - "renderMs": 99.0132080000003, - "diffMs": 0.11716599999999744, - "writeMs": 0.0007079999995767139, - "frameMs": 151.69650000000001, - "memory": { - "rss": 1187184640, - "heapTotal": 173106176, - "heapUsed": 98852222, - "external": 85827246 - } - }, - { - "id": 35, - "time": 1765732174434, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 49.661417000000256, - "renderMs": 77.33358300000054, - "diffMs": 0.1152910000000702, - "writeMs": 0.0007079999995767139, - "frameMs": 127.15041699999983, - "memory": { - "rss": 1187250176, - "heapTotal": 173106176, - "heapUsed": 98874146, - "external": 85831890 - } - }, - { - "id": 36, - "time": 1765732174572, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 48.93891699999949, - "renderMs": 81.09483400000045, - "diffMs": 0.10999999999967258, - "writeMs": 0.0005420000006779446, - "frameMs": 130.20670800000062, - "memory": { - "rss": 1187250176, - "heapTotal": 101032960, - "heapUsed": 98893910, - "external": 85834406 - } - }, - { - "id": 37, - "time": 1765732174702, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 48.600500000000466, - "renderMs": 77.83008299999983, - "diffMs": 0.11954100000002654, - "writeMs": 0.004249999999956344, - "frameMs": 126.5986670000002, - "memory": { - "rss": 1187676160, - "heapTotal": 101393408, - "heapUsed": 99919491, - "external": 86230403 - } - }, - { - "id": 38, - "time": 1765732174839, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 49.40162500000042, - "renderMs": 81.45504100000016, - "diffMs": 0.13504199999988487, - "writeMs": 0.00204200000007404, - "frameMs": 131.01941699999952, - "memory": { - "rss": 1187692544, - "heapTotal": 99705856, - "heapUsed": 99938503, - "external": 86232471 - } - }, - { - "id": 39, - "time": 1765732174981, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 50.16108299999996, - "renderMs": 81.5913330000003, - "diffMs": 0.11291700000037963, - "writeMs": 0.001457999999729509, - "frameMs": 131.88550000000032, - "memory": { - "rss": 1187692544, - "heapTotal": 98247680, - "heapUsed": 99957163, - "external": 86234539 - } - }, - { - "id": 40, - "time": 1765732175113, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 50.18187500000022, - "renderMs": 92.47233299999971, - "diffMs": 0.11733300000014424, - "writeMs": 0.0005839999994350364, - "frameMs": 142.79058300000088, - "memory": { - "rss": 1187692544, - "heapTotal": 173679616, - "heapUsed": 99957163, - "external": 86234539 - } - }, - { - "id": 41, - "time": 1765732175256, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 25, - "diffCellsChanged": 2, - "diffOps": 4, - "diffCursorMoves": 2, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 49.68333299999995, - "renderMs": 78.03904200000034, - "diffMs": 0.12004199999955745, - "writeMs": 0.0005840000003445311, - "frameMs": 127.86391599999934, - "memory": { - "rss": 1187889152, - "heapTotal": 173679616, - "heapUsed": 99976031, - "external": 86236607 - } - }, - { - "id": 42, - "time": 1765732175395, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 56.15766699999949, - "renderMs": 86.83583400000043, - "diffMs": 0.12266699999963748, - "writeMs": 0.0006250000005820766, - "frameMs": 143.13675000000057, - "memory": { - "rss": 1187889152, - "heapTotal": 101606400, - "heapUsed": 99995619, - "external": 86239123 - } - }, - { - "id": 43, - "time": 1765732175549, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 52.35870799999975, - "renderMs": 83.84541699999954, - "diffMs": 0.12529199999971752, - "writeMs": 0.0006659999999101274, - "frameMs": 136.35520799999995, - "memory": { - "rss": 1187889152, - "heapTotal": 100066304, - "heapUsed": 100014279, - "external": 86241191 - } - }, - { - "id": 44, - "time": 1765732175685, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 50.8187080000007, - "renderMs": 103.40254199999981, - "diffMs": 0.1187499999996362, - "writeMs": 0.0005000000001018634, - "frameMs": 154.36079100000006, - "memory": { - "rss": 1188151296, - "heapTotal": 173728768, - "heapUsed": 100014279, - "external": 86241191 - } - }, - { - "id": 45, - "time": 1765732175840, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 55.39983399999983, - "renderMs": 86.6274999999996, - "diffMs": 0.12191599999914615, - "writeMs": 0.0006670000002486631, - "frameMs": 142.17124999999942, - "memory": { - "rss": 1188151296, - "heapTotal": 173728768, - "heapUsed": 100033147, - "external": 86243259 - } - }, - { - "id": 46, - "time": 1765732175993, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 51.402250000000095, - "renderMs": 83.76154200000019, - "diffMs": 0.11345900000014808, - "writeMs": 0.0003749999996216502, - "frameMs": 135.2971660000003, - "memory": { - "rss": 1188151296, - "heapTotal": 101721088, - "heapUsed": 100052063, - "external": 86245327 - } - }, - { - "id": 47, - "time": 1765732176139, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 50.28770800000075, - "renderMs": 81.82583400000021, - "diffMs": 0.11549999999988358, - "writeMs": 0.0009169999993901001, - "frameMs": 132.25120900000002, - "memory": { - "rss": 1188167680, - "heapTotal": 100099072, - "heapUsed": 100070723, - "external": 86247395 - } - }, - { - "id": 48, - "time": 1765732176271, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 55.04320799999914, - "renderMs": 99.06566699999985, - "diffMs": 0.11833299999943847, - "writeMs": 0.0004579999995257822, - "frameMs": 154.2727500000001, - "memory": { - "rss": 1188167680, - "heapTotal": 173777920, - "heapUsed": 100070723, - "external": 86247395 - } - }, - { - "id": 49, - "time": 1765732176426, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 49.85454200000004, - "renderMs": 79.25554100000045, - "diffMs": 0.11129200000050332, - "writeMs": 0.0004170000001977314, - "frameMs": 129.23345900000004, - "memory": { - "rss": 1188167680, - "heapTotal": 173777920, - "heapUsed": 100091743, - "external": 86251391 - } - }, - { - "id": 50, - "time": 1765732176566, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 49.22595900000033, - "renderMs": 82.47187500000018, - "diffMs": 0.12449999999989814, - "writeMs": 0.0007500000001527951, - "frameMs": 131.85716700000012, - "memory": { - "rss": 1188184064, - "heapTotal": 101803008, - "heapUsed": 100110659, - "external": 86253459 - } - }, - { - "id": 51, - "time": 1765732176698, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 25, - "diffCellsChanged": 2, - "diffOps": 4, - "diffCursorMoves": 2, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 49.258082999999715, - "renderMs": 82.46016599999984, - "diffMs": 0.12345800000002782, - "writeMs": 0.0006670000002486631, - "frameMs": 131.88016599999992, - "memory": { - "rss": 1188184064, - "heapTotal": 101803008, - "heapUsed": 100130783, - "external": 86256319 - } - }, - { - "id": 52, - "time": 1765732176841, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 53.22870800000055, - "renderMs": 86.1722920000002, - "diffMs": 0.11787499999991269, - "writeMs": 0.0005420000006779446, - "frameMs": 139.5379159999993, - "memory": { - "rss": 1188184064, - "heapTotal": 100115456, - "heapUsed": 100151019, - "external": 86259515 - } - }, - { - "id": 53, - "time": 1765732176991, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 50.559291999999914, - "renderMs": 82.5821249999999, - "diffMs": 0.11370799999986048, - "writeMs": 0.0008749999997235136, - "frameMs": 133.27445799999987, - "memory": { - "rss": 1188184064, - "heapTotal": 98739200, - "heapUsed": 100172247, - "external": 86263255 - } - }, - { - "id": 54, - "time": 1765732177135, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 51.01158299999952, - "renderMs": 81.53891600000043, - "diffMs": 0.1263330000001588, - "writeMs": 0.0006250000005820766, - "frameMs": 132.69358300000022, - "memory": { - "rss": 1188184064, - "heapTotal": 97330176, - "heapUsed": 100191163, - "external": 86265323 - } - }, - { - "id": 55, - "time": 1765732177268, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 53.64037499999995, - "renderMs": 98.71279200000026, - "diffMs": 0.10558400000081747, - "writeMs": 0.0003750000005311449, - "frameMs": 152.4744579999997, - "memory": { - "rss": 1188282368, - "heapTotal": 173892608, - "heapUsed": 100191163, - "external": 86265323 - } - }, - { - "id": 56, - "time": 1765732177421, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 52.778957999999875, - "renderMs": 80.5679169999994, - "diffMs": 0.10854199999994307, - "writeMs": 0.0006250000005820766, - "frameMs": 133.46987499999977, - "memory": { - "rss": 1188282368, - "heapTotal": 173892608, - "heapUsed": 100210911, - "external": 86267391 - } - }, - { - "id": 57, - "time": 1765732177565, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 50.687417000000096, - "renderMs": 81.49766700000055, - "diffMs": 0.11829199999920093, - "writeMs": 0.0008339999994859681, - "frameMs": 132.32229200000074, - "memory": { - "rss": 1188282368, - "heapTotal": 101393408, - "heapUsed": 100229571, - "external": 86269459 - } - }, - { - "id": 58, - "time": 1765732177698, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 49.727750000000015, - "renderMs": 80.18166700000074, - "diffMs": 0.11170799999854353, - "writeMs": 0.0008330000000569271, - "frameMs": 130.03804199999922, - "memory": { - "rss": 1188282368, - "heapTotal": 101393408, - "heapUsed": 100248487, - "external": 86271527 - } - }, - { - "id": 59, - "time": 1765732177838, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 54.727459000001545, - "renderMs": 91.2042079999992, - "diffMs": 0.11729100000047765, - "writeMs": 0.0005839999994350364, - "frameMs": 146.06925000000047, - "memory": { - "rss": 1188282368, - "heapTotal": 99656704, - "heapUsed": 100267147, - "external": 86273595 - } - }, - { - "id": 60, - "time": 1765732177995, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 51.12287500000093, - "renderMs": 82.84341700000004, - "diffMs": 0.10987500000010186, - "writeMs": 0.00045900000077381264, - "frameMs": 134.09375, - "memory": { - "rss": 1188282368, - "heapTotal": 97477632, - "heapUsed": 100285807, - "external": 86275663 - } - }, - { - "id": 61, - "time": 1765732178140, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 25, - "diffCellsChanged": 2, - "diffOps": 4, - "diffCursorMoves": 2, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 50.33920799999942, - "renderMs": 83.50283399999898, - "diffMs": 0.11029200000120909, - "writeMs": 0.0006670000002486631, - "frameMs": 133.97158300000046, - "memory": { - "rss": 1188315136, - "heapTotal": 95773696, - "heapUsed": 100304467, - "external": 86277731 - } - }, - { - "id": 62, - "time": 1765732178274, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 50.62162499999977, - "renderMs": 81.41904199999954, - "diffMs": 0.11166600000069593, - "writeMs": 0.00033400000029359944, - "frameMs": 132.16912500000035, - "memory": { - "rss": 1188708352, - "heapTotal": 173990912, - "heapUsed": 100304467, - "external": 86277731 - } - }, - { - "id": 63, - "time": 1765732178406, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 51.76637500000106, - "renderMs": 83.24754100000064, - "diffMs": 0.11475000000064028, - "writeMs": 0.0010000000002037268, - "frameMs": 135.14650000000074, - "memory": { - "rss": 1188708352, - "heapTotal": 173990912, - "heapUsed": 100323591, - "external": 86279799 - } - }, - { - "id": 64, - "time": 1765732178552, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 51.37333300000137, - "renderMs": 82.49362500000097, - "diffMs": 0.125292000000627, - "writeMs": 0.0007079999995767139, - "frameMs": 134.01150000000052, - "memory": { - "rss": 1188708352, - "heapTotal": 101016576, - "heapUsed": 100342251, - "external": 86281867 - } - }, - { - "id": 65, - "time": 1765732178687, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 50.04699999999866, - "renderMs": 79.98862499999996, - "diffMs": 0.11470799999915471, - "writeMs": 0.0005839999994350364, - "frameMs": 130.16870800000106, - "memory": { - "rss": 1188708352, - "heapTotal": 101016576, - "heapUsed": 100360911, - "external": 86283935 - } - }, - { - "id": 66, - "time": 1765732178828, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 51.8877080000002, - "renderMs": 83.17000000000007, - "diffMs": 0.11849999999867578, - "writeMs": 0.0006659999999101274, - "frameMs": 135.1939170000005, - "memory": { - "rss": 1188724736, - "heapTotal": 99116032, - "heapUsed": 100379827, - "external": 86286003 - } - }, - { - "id": 67, - "time": 1765732178973, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 48.92712500000016, - "renderMs": 80.96395800000028, - "diffMs": 0.11729200000081619, - "writeMs": 0.0005000000001018634, - "frameMs": 130.0236249999998, - "memory": { - "rss": 1188724736, - "heapTotal": 96396288, - "heapUsed": 100401287, - "external": 86290647 - } - }, - { - "id": 68, - "time": 1765732179123, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 49.37158400000044, - "renderMs": 82.42795800000022, - "diffMs": 0.11104100000011385, - "writeMs": 0.0003750000014406396, - "frameMs": 131.9240000000009, - "memory": { - "rss": 1188659200, - "heapTotal": 94938112, - "heapUsed": 100419947, - "external": 86292715 - } - }, - { - "id": 69, - "time": 1765732179255, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 51.14191700000083, - "renderMs": 84.21125000000029, - "diffMs": 0.11020800000005693, - "writeMs": 0.0005419999997684499, - "frameMs": 135.48099999999977, - "memory": { - "rss": 1189052416, - "heapTotal": 174105600, - "heapUsed": 100419947, - "external": 86292715 - } - }, - { - "id": 70, - "time": 1765732179391, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 51.65241700000115, - "renderMs": 86.80333300000166, - "diffMs": 0.12645799999882001, - "writeMs": 0.0006670000002486631, - "frameMs": 138.6031669999993, - "memory": { - "rss": 1189183488, - "heapTotal": 174105600, - "heapUsed": 100439071, - "external": 86294783 - } - }, - { - "id": 71, - "time": 1765732179540, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 25, - "diffCellsChanged": 2, - "diffOps": 4, - "diffCursorMoves": 2, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 56.43854199999987, - "renderMs": 92.32695799999965, - "diffMs": 0.13400000000001455, - "writeMs": 0.0006669999984296737, - "frameMs": 148.9192920000005, - "memory": { - "rss": 1187889152, - "heapTotal": 101311488, - "heapUsed": 100457731, - "external": 86296851 - } - }, - { - "id": 72, - "time": 1765732179689, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 54.821500000000015, - "renderMs": 83.68662500000028, - "diffMs": 0.1290420000004815, - "writeMs": 0.0006250000005820766, - "frameMs": 138.66120800000135, - "memory": { - "rss": 1187889152, - "heapTotal": 101311488, - "heapUsed": 100476391, - "external": 86298919 - } - }, - { - "id": 73, - "time": 1765732179839, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 55.43733299999985, - "renderMs": 83.09074999999939, - "diffMs": 0.11454200000116543, - "writeMs": 0.0005830000009154901, - "frameMs": 138.66170799999963, - "memory": { - "rss": 1187889152, - "heapTotal": 98821120, - "heapUsed": 100495051, - "external": 86300987 - } - }, - { - "id": 74, - "time": 1765732179988, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 53.34687499999927, - "renderMs": 83.28908300000148, - "diffMs": 0.11700000000018917, - "writeMs": 0.0005419999997684499, - "frameMs": 136.78670799999963, - "memory": { - "rss": 1187741696, - "heapTotal": 95986688, - "heapUsed": 100513967, - "external": 86303055 - } - }, - { - "id": 75, - "time": 1765732180133, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 50.32612500000141, - "renderMs": 82.97712500000125, - "diffMs": 0.13008300000001327, - "writeMs": 0.0005000000001018634, - "frameMs": 133.45158300000003, - "memory": { - "rss": 1187840000, - "heapTotal": 94217216, - "heapUsed": 100532627, - "external": 86305123 - } - }, - { - "id": 76, - "time": 1765732180267, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 54.32841699999881, - "renderMs": 69.50916599999982, - "diffMs": 0.11287500000071304, - "writeMs": 0.0004580000004352769, - "frameMs": 123.96720800000003, - "memory": { - "rss": 1188216832, - "heapTotal": 174220288, - "heapUsed": 100532627, - "external": 86305123 - } - }, - { - "id": 77, - "time": 1765732180391, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 50.038542000000234, - "renderMs": 82.40320799999972, - "diffMs": 0.10587499999928696, - "writeMs": 0.0003749999996216502, - "frameMs": 132.5625, - "memory": { - "rss": 1188560896, - "heapTotal": 174220288, - "heapUsed": 100551495, - "external": 86307191 - } - }, - { - "id": 78, - "time": 1765732180534, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 54.59379199999967, - "renderMs": 88.94570799999929, - "diffMs": 0.13850000000093132, - "writeMs": 0.0005419999997684499, - "frameMs": 143.69612499999857, - "memory": { - "rss": 1188560896, - "heapTotal": 101262336, - "heapUsed": 100570411, - "external": 86309259 - } - }, - { - "id": 79, - "time": 1765732180679, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 51.19854199999827, - "renderMs": 86.1787919999988, - "diffMs": 0.10925000000133878, - "writeMs": 0.0007499999992433004, - "frameMs": 137.5067910000016, - "memory": { - "rss": 1188577280, - "heapTotal": 101262336, - "heapUsed": 100590471, - "external": 86312503 - } - }, - { - "id": 80, - "time": 1765732180827, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 52.719458999999915, - "renderMs": 82.30058300000019, - "diffMs": 0.11724999999933061, - "writeMs": 0.0005419999997684499, - "frameMs": 135.15712499999972, - "memory": { - "rss": 1188577280, - "heapTotal": 98296832, - "heapUsed": 100609131, - "external": 86314571 - } - }, - { - "id": 81, - "time": 1765732180972, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 25, - "diffCellsChanged": 2, - "diffOps": 4, - "diffCursorMoves": 2, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 49.65412500000093, - "renderMs": 82.59179200000108, - "diffMs": 0.10816599999998289, - "writeMs": 0.0005000000001018634, - "frameMs": 132.37258400000064, - "memory": { - "rss": 1188577280, - "heapTotal": 95446016, - "heapUsed": 100627791, - "external": 86316639 - } - }, - { - "id": 82, - "time": 1765732181109, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 49.09074999999939, - "renderMs": 83.88212500000009, - "diffMs": 0.11049999999886495, - "writeMs": 0.0005000000001018634, - "frameMs": 133.09816699999828, - "memory": { - "rss": 1188577280, - "heapTotal": 94331904, - "heapUsed": 100646707, - "external": 86318707 - } - }, - { - "id": 83, - "time": 1765732181242, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 50.92079100000046, - "renderMs": 69.44599999999991, - "diffMs": 0.10974999999962165, - "writeMs": 0.0005840000012540258, - "frameMs": 120.4942919999994, - "memory": { - "rss": 1188626432, - "heapTotal": 174318592, - "heapUsed": 100646707, - "external": 86318707 - } - }, - { - "id": 84, - "time": 1765732181364, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 50.715291000000434, - "renderMs": 84.82345799999894, - "diffMs": 0.12570899999991525, - "writeMs": 0.0007919999989098869, - "frameMs": 135.68370800000048, - "memory": { - "rss": 1188691968, - "heapTotal": 174318592, - "heapUsed": 100667695, - "external": 86322671 - } - }, - { - "id": 85, - "time": 1765732181510, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 54.14324999999917, - "renderMs": 87.19416599999931, - "diffMs": 0.11729099999865866, - "writeMs": 0.0005000000001018634, - "frameMs": 141.47420799999963, - "memory": { - "rss": 1188691968, - "heapTotal": 101327872, - "heapUsed": 100686355, - "external": 86324739 - } - }, - { - "id": 86, - "time": 1765732181662, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 52.123083000000406, - "renderMs": 84.75170900000012, - "diffMs": 0.13116699999955017, - "writeMs": 0.0008339999985764734, - "frameMs": 137.02770899999996, - "memory": { - "rss": 1188691968, - "heapTotal": 98509824, - "heapUsed": 100705271, - "external": 86326807 - } - }, - { - "id": 87, - "time": 1765732181800, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 52.15495899999951, - "renderMs": 82.46429200000057, - "diffMs": 0.11404100000072503, - "writeMs": 0.0007920000007288763, - "frameMs": 134.75283299999865, - "memory": { - "rss": 1188823040, - "heapTotal": 174384128, - "heapUsed": 100705271, - "external": 86326807 - } - }, - { - "id": 88, - "time": 1765732181935, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 51.238624999999956, - "renderMs": 85.37562499999876, - "diffMs": 0.13999999999941792, - "writeMs": 0.0007919999989098869, - "frameMs": 136.7736249999998, - "memory": { - "rss": 1188823040, - "heapTotal": 174384128, - "heapUsed": 100724139, - "external": 86328875 - } - }, - { - "id": 89, - "time": 1765732182082, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 50.23395799999889, - "renderMs": 85.55170900000121, - "diffMs": 0.11033300000053714, - "writeMs": 0.0007919999989098869, - "frameMs": 135.9144580000011, - "memory": { - "rss": 1188823040, - "heapTotal": 102228992, - "heapUsed": 100742799, - "external": 86330943 - } - }, - { - "id": 90, - "time": 1765732182229, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 53.77862500000083, - "renderMs": 86.95354200000111, - "diffMs": 0.13220899999942048, - "writeMs": 0.0010000000002037268, - "frameMs": 140.88508399999955, - "memory": { - "rss": 1188823040, - "heapTotal": 100443136, - "heapUsed": 100761715, - "external": 86333011 - } - }, - { - "id": 91, - "time": 1765732182370, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 25, - "diffCellsChanged": 2, - "diffOps": 4, - "diffCursorMoves": 2, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 52.13337499999943, - "renderMs": 102.58358300000145, - "diffMs": 0.11533299999973678, - "writeMs": 0.0005000000001018634, - "frameMs": 154.8517499999998, - "memory": { - "rss": 1189249024, - "heapTotal": 174433280, - "heapUsed": 100761715, - "external": 86333011 - } - }, - { - "id": 92, - "time": 1765732182526, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 58.771334000000934, - "renderMs": 83.51912500000071, - "diffMs": 0.11712500000066939, - "writeMs": 0.000709000001734239, - "frameMs": 142.4265830000004, - "memory": { - "rss": 1189265408, - "heapTotal": 174433280, - "heapUsed": 100780583, - "external": 86335079 - } - }, - { - "id": 93, - "time": 1765732182668, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 54.66437500000029, - "renderMs": 102.07216700000026, - "diffMs": 0.10770899999988615, - "writeMs": 0.0003329999999550637, - "frameMs": 156.85974999999962, - "memory": { - "rss": 1191002112, - "heapTotal": 174449664, - "heapUsed": 100780583, - "external": 86335079 - } - }, - { - "id": 94, - "time": 1765732182825, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 54.17620799999895, - "renderMs": 84.6668750000008, - "diffMs": 0.11495800000011513, - "writeMs": 0.0004580000004352769, - "frameMs": 138.97420799999963, - "memory": { - "rss": 1191002112, - "heapTotal": 174449664, - "heapUsed": 100799707, - "external": 86337147 - } - }, - { - "id": 95, - "time": 1765732182975, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 52.78204199999891, - "renderMs": 82.41208299999926, - "diffMs": 0.12695799999892188, - "writeMs": 0.0007500000010622898, - "frameMs": 135.34000000000015, - "memory": { - "rss": 1191002112, - "heapTotal": 103064576, - "heapUsed": 100818367, - "external": 86339215 - } - }, - { - "id": 96, - "time": 1765732183121, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 49.93804199999977, - "renderMs": 82.85033300000032, - "diffMs": 0.1320000000014261, - "writeMs": 0.0006250000005820766, - "frameMs": 132.93854100000135, - "memory": { - "rss": 1191002112, - "heapTotal": 101606400, - "heapUsed": 100837627, - "external": 86341659 - } - }, - { - "id": 97, - "time": 1765732183254, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 56.965791000000536, - "renderMs": 111.77924999999959, - "diffMs": 0.11804200000005949, - "writeMs": 0.0006249999987630872, - "frameMs": 168.88200000000143, - "memory": { - "rss": 1191002112, - "heapTotal": 174498816, - "heapUsed": 100837627, - "external": 86341659 - } - }, - { - "id": 98, - "time": 1765732183423, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 55.478791999999885, - "renderMs": 81.90512500000114, - "diffMs": 0.11516699999992852, - "writeMs": 0.021833999999216758, - "frameMs": 137.54112499999974, - "memory": { - "rss": 1191002112, - "heapTotal": 174515200, - "heapUsed": 100856751, - "external": 86343727 - } - }, - { - "id": 99, - "time": 1765732183572, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 51.837625000000116, - "renderMs": 86.90591700000004, - "diffMs": 0.10687499999949068, - "writeMs": 0.010374999999839929, - "frameMs": 138.878917, - "memory": { - "rss": 1191002112, - "heapTotal": 102982656, - "heapUsed": 100875635, - "external": 86345795 - } - }, - { - "id": 100, - "time": 1765732183711, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 53.75604199999907, - "renderMs": 84.86454200000117, - "diffMs": 0.11645900000075926, - "writeMs": 0.0007079999995767139, - "frameMs": 138.77516599999944, - "memory": { - "rss": 1191002112, - "heapTotal": 102982656, - "heapUsed": 100894295, - "external": 86347863 - } - }, - { - "id": 101, - "time": 1765732183860, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 33, - "diffCellsChanged": 3, - "diffOps": 5, - "diffCursorMoves": 3, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 50.78929199999948, - "renderMs": 83.03050000000076, - "diffMs": 0.12429200000042329, - "writeMs": 0.00370900000052643, - "frameMs": 133.96999999999935, - "memory": { - "rss": 1191018496, - "heapTotal": 101426176, - "heapUsed": 100914963, - "external": 86351267 - } - }, - { - "id": 102, - "time": 1765732184005, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 52.20666700000038, - "renderMs": 85.3427499999998, - "diffMs": 0.10916699999870616, - "writeMs": 0.00008300000081362668, - "frameMs": 137.67475000000013, - "memory": { - "rss": 1191018496, - "heapTotal": 100148224, - "heapUsed": 100947938, - "external": 86363794 - } - }, - { - "id": 103, - "time": 1765732184153, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 51.97070900000108, - "renderMs": 86.01579200000015, - "diffMs": 0.11587499999950523, - "writeMs": 0.00008300000081362668, - "frameMs": 138.1187919999993, - "memory": { - "rss": 1191018496, - "heapTotal": 98870272, - "heapUsed": 100966927, - "external": 86365967 - } - }, - { - "id": 104, - "time": 1765732184292, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 51.891333999999915, - "renderMs": 103.24204199999986, - "diffMs": 0.1172500000011496, - "writeMs": 0.00020899999981338624, - "frameMs": 155.26745799999844, - "memory": { - "rss": 1191018496, - "heapTotal": 174629888, - "heapUsed": 100966927, - "external": 86365967 - } - }, - { - "id": 105, - "time": 1765732184447, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 50.039292000001296, - "renderMs": 87.29545899999903, - "diffMs": 0.12508300000081363, - "writeMs": 0.00008300000081362668, - "frameMs": 137.47654200000034, - "memory": { - "rss": 1191018496, - "heapTotal": 174629888, - "heapUsed": 100985796, - "external": 86368036 - } - }, - { - "id": 106, - "time": 1765732184596, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 50.45079200000146, - "renderMs": 84.17354199999863, - "diffMs": 0.11720799999966403, - "writeMs": 0.00020799999947485048, - "frameMs": 134.76024999999936, - "memory": { - "rss": 1191018496, - "heapTotal": 102671360, - "heapUsed": 101004713, - "external": 86370105 - } - }, - { - "id": 107, - "time": 1765732184731, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 50.8030830000007, - "renderMs": 83.83666600000106, - "diffMs": 0.11587499999950523, - "writeMs": 0.00016700000014679972, - "frameMs": 134.77145799999926, - "memory": { - "rss": 1191018496, - "heapTotal": 102671360, - "heapUsed": 101023374, - "external": 86372174 - } - }, - { - "id": 108, - "time": 1765732184876, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 50.79845899999964, - "renderMs": 85.05791599999975, - "diffMs": 0.11462500000016007, - "writeMs": 0.00008400000115216244, - "frameMs": 135.9880830000002, - "memory": { - "rss": 1191018496, - "heapTotal": 100967424, - "heapUsed": 101042035, - "external": 86374243 - } - }, - { - "id": 109, - "time": 1765732185023, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 49.56791700000031, - "renderMs": 84.79420800000116, - "diffMs": 0.10687499999949068, - "writeMs": 0.00004099999932805076, - "frameMs": 134.4819580000003, - "memory": { - "rss": 1191018496, - "heapTotal": 99083264, - "heapUsed": 101060696, - "external": 86376312 - } - }, - { - "id": 110, - "time": 1765732185168, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 50.51237499999843, - "renderMs": 85.29399999999987, - "diffMs": 0.1274169999996957, - "writeMs": 0.0001249999986612238, - "frameMs": 135.94933400000082, - "memory": { - "rss": 1191018496, - "heapTotal": 97330176, - "heapUsed": 101079613, - "external": 86378381 - } - }, - { - "id": 111, - "time": 1765732185304, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 25, - "diffCellsChanged": 2, - "diffOps": 4, - "diffCursorMoves": 2, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 56.18616699999984, - "renderMs": 87.78141700000015, - "diffMs": 0.1258749999997235, - "writeMs": 0.00016700000014679972, - "frameMs": 144.1091660000002, - "memory": { - "rss": 1191018496, - "heapTotal": 174728192, - "heapUsed": 101079613, - "external": 86378381 - } - }, - { - "id": 112, - "time": 1765732185448, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 57.97862499999974, - "renderMs": 82.41450000000077, - "diffMs": 0.11995799999931478, - "writeMs": 0.00020899999981338624, - "frameMs": 140.53016600000046, - "memory": { - "rss": 1191018496, - "heapTotal": 174728192, - "heapUsed": 101100258, - "external": 86380450 - } - }, - { - "id": 113, - "time": 1765732185600, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 50.41150000000016, - "renderMs": 82.6567500000001, - "diffMs": 0.12754099999983737, - "writeMs": 0.00020799999947485048, - "frameMs": 133.21204200000102, - "memory": { - "rss": 1191018496, - "heapTotal": 102048768, - "heapUsed": 101118919, - "external": 86382519 - } - }, - { - "id": 114, - "time": 1765732185733, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 49.73912499999824, - "renderMs": 82.5307499999999, - "diffMs": 0.14595899999949324, - "writeMs": 0.0001249999986612238, - "frameMs": 132.43625000000065, - "memory": { - "rss": 1191018496, - "heapTotal": 102048768, - "heapUsed": 101137836, - "external": 86384588 - } - }, - { - "id": 115, - "time": 1765732185876, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 52.007958999998664, - "renderMs": 84.0336669999997, - "diffMs": 0.11541700000088895, - "writeMs": 0.00004199999966658652, - "frameMs": 136.17091600000094, - "memory": { - "rss": 1191018496, - "heapTotal": 100230144, - "heapUsed": 101156497, - "external": 86386657 - } - }, - { - "id": 116, - "time": 1765732186023, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 50.65220800000316, - "renderMs": 83.21479100000215, - "diffMs": 0.13300000000162981, - "writeMs": 0.00020799999765586108, - "frameMs": 134.01458399999683, - "memory": { - "rss": 1191018496, - "heapTotal": 97592320, - "heapUsed": 101175158, - "external": 86388726 - } - }, - { - "id": 117, - "time": 1765732186167, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 53.92058399999951, - "renderMs": 83.1294999999991, - "diffMs": 0.10745799999858718, - "writeMs": 0.00008399999933317304, - "frameMs": 137.17304100000183, - "memory": { - "rss": 1191018496, - "heapTotal": 95822848, - "heapUsed": 101193819, - "external": 86390795 - } - }, - { - "id": 118, - "time": 1765732186305, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 53.09783400000015, - "renderMs": 78.32204099999944, - "diffMs": 0.11541699999725097, - "writeMs": 0.00008300000263261609, - "frameMs": 131.5511669999978, - "memory": { - "rss": 1191018496, - "heapTotal": 174859264, - "heapUsed": 101193819, - "external": 86390795 - } - }, - { - "id": 119, - "time": 1765732186437, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 51.83533299999908, - "renderMs": 86.52174999999988, - "diffMs": 0.12879200000315905, - "writeMs": 0.00008299999899463728, - "frameMs": 138.50050000000192, - "memory": { - "rss": 1191018496, - "heapTotal": 174859264, - "heapUsed": 101215400, - "external": 86395096 - } - }, - { - "id": 120, - "time": 1765732186586, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 56.14849999999933, - "renderMs": 89.28754199999821, - "diffMs": 0.14045900000201073, - "writeMs": 0.00008399999933317304, - "frameMs": 145.59354099999837, - "memory": { - "rss": 1190871040, - "heapTotal": 102097920, - "heapUsed": 101234061, - "external": 86397165 - } - } - ], - "summary": { - "frameCount": 120, - "frameMs": { - "p50": 135.94933400000082, - "p95": 154.36079100000006, - "p99": 162.52229199999988, - "max": 168.88200000000143 - }, - "totals": { - "layoutMs": 6211.829093000002, - "renderMs": 10292.19279000001, - "diffMs": 14.636541000000534, - "writeMs": 0.12142599999759796, - "frameMs": 16521.749786 - } - } -} \ No newline at end of file diff --git a/profiles/stress-1765733920188.json b/profiles/stress-1765733920188.json deleted file mode 100644 index d2c372b..0000000 --- a/profiles/stress-1765733920188.json +++ /dev/null @@ -1,3023 +0,0 @@ -{ - "version": 1, - "startedAt": "2025-12-14T17:38:40.191Z", - "endedAt": "2025-12-14T17:38:48.905Z", - "frames": [ - { - "id": 1, - "time": 1765733920198, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 2584, - "diffCellsChanged": 330, - "diffOps": 333, - "diffCursorMoves": 330, - "diffStyleChanges": 2, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 54.271291000000005, - "renderMs": 72.660125, - "diffMs": 0.40237500000000637, - "writeMs": 0.009042000000022199, - "frameMs": 127.667292, - "memory": { - "rss": 669188096, - "heapTotal": 81826816, - "heapUsed": 37022117, - "external": 85075194 - } - }, - { - "id": 2, - "time": 1765733920327, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 78.81787499999999, - "diffMs": 0.15408300000001418, - "writeMs": 0.002666000000004942, - "frameMs": 79, - "memory": { - "rss": 679952384, - "heapTotal": 87892992, - "heapUsed": 97855049, - "external": 85260793 - } - }, - { - "id": 3, - "time": 1765733920407, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 69.50799999999998, - "diffMs": 0.15054100000003245, - "writeMs": 0.002207999999995991, - "frameMs": 69.67908299999996, - "memory": { - "rss": 679985152, - "heapTotal": 87892992, - "heapUsed": 97892907, - "external": 85293819 - } - }, - { - "id": 4, - "time": 1765733920476, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 67.08908300000002, - "diffMs": 0.09133300000002009, - "writeMs": 0.0005409999999983484, - "frameMs": 67.19512499999996, - "memory": { - "rss": 1120108544, - "heapTotal": 136881152, - "heapUsed": 97892907, - "external": 85293819 - } - }, - { - "id": 5, - "time": 1765733920544, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 67.195625, - "diffMs": 0.09454199999998991, - "writeMs": 0.0006250000000136424, - "frameMs": 67.30879099999999, - "memory": { - "rss": 1120337920, - "heapTotal": 136881152, - "heapUsed": 97919889, - "external": 85319617 - } - }, - { - "id": 6, - "time": 1765733920612, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 69.48399999999998, - "diffMs": 0.10591699999997672, - "writeMs": 0.0011669999999526226, - "frameMs": 69.60608399999995, - "memory": { - "rss": 1120665600, - "heapTotal": 136881152, - "heapUsed": 97920481, - "external": 85319649 - } - }, - { - "id": 7, - "time": 1765733920682, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 69.469875, - "diffMs": 0.12758400000006986, - "writeMs": 0.0007500000000391083, - "frameMs": 69.61624999999998, - "memory": { - "rss": 1120681984, - "heapTotal": 136881152, - "heapUsed": 97931325, - "external": 85329885 - } - }, - { - "id": 8, - "time": 1765733920752, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 71.66958299999999, - "diffMs": 0.1478749999999991, - "writeMs": 0.00037500000007639755, - "frameMs": 71.83179200000006, - "memory": { - "rss": 1120681984, - "heapTotal": 136881152, - "heapUsed": 97931325, - "external": 85329885 - } - }, - { - "id": 9, - "time": 1765733920824, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 71.13049999999998, - "diffMs": 0.14629100000001927, - "writeMs": 0.0007500000000391083, - "frameMs": 71.29375000000005, - "memory": { - "rss": 1120681984, - "heapTotal": 136881152, - "heapUsed": 97934636, - "external": 85332284 - } - }, - { - "id": 10, - "time": 1765733920895, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 70.00158299999998, - "diffMs": 0.12704099999996288, - "writeMs": 0.0009160000000747459, - "frameMs": 70.14529199999993, - "memory": { - "rss": 1120681984, - "heapTotal": 136881152, - "heapUsed": 97935228, - "external": 85332316 - } - }, - { - "id": 11, - "time": 1765733920966, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 25, - "diffCellsChanged": 2, - "diffOps": 4, - "diffCursorMoves": 2, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 70.47133299999996, - "diffMs": 0.11354100000005474, - "writeMs": 0.0008749999999508873, - "frameMs": 70.60941600000001, - "memory": { - "rss": 1120681984, - "heapTotal": 136881152, - "heapUsed": 97935724, - "external": 85332348 - } - }, - { - "id": 12, - "time": 1765733921037, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 72.3687920000001, - "diffMs": 0.10695899999996072, - "writeMs": 0.0006670000000212895, - "frameMs": 72.506125, - "memory": { - "rss": 1120714752, - "heapTotal": 136881152, - "heapUsed": 97935724, - "external": 85332348 - } - }, - { - "id": 13, - "time": 1765733921110, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 69.19716600000004, - "diffMs": 0.13095899999996163, - "writeMs": 0.00029099999994741665, - "frameMs": 69.34779199999991, - "memory": { - "rss": 1120714752, - "heapTotal": 136881152, - "heapUsed": 97936557, - "external": 85332381 - } - }, - { - "id": 14, - "time": 1765733921180, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 68.97241700000006, - "diffMs": 0.11349999999993088, - "writeMs": 0.0002910000000611035, - "frameMs": 69.10933299999988, - "memory": { - "rss": 1120714752, - "heapTotal": 136881152, - "heapUsed": 97937286, - "external": 85332502 - } - }, - { - "id": 15, - "time": 1765733921249, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 69.06179199999997, - "diffMs": 0.13408299999991868, - "writeMs": 0.0002910000000611035, - "frameMs": 69.23695800000019, - "memory": { - "rss": 1120714752, - "heapTotal": 136881152, - "heapUsed": 97937623, - "external": 85332535 - } - }, - { - "id": 16, - "time": 1765733921319, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 69.09308299999998, - "diffMs": 0.1118340000000444, - "writeMs": 0.00041699999997035775, - "frameMs": 69.26312500000017, - "memory": { - "rss": 1120714752, - "heapTotal": 136881152, - "heapUsed": 97937960, - "external": 85332568 - } - }, - { - "id": 17, - "time": 1765733921388, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 69.54129200000011, - "diffMs": 0.11712499999998727, - "writeMs": 0.00033400000006622577, - "frameMs": 69.68358400000011, - "memory": { - "rss": 1120714752, - "heapTotal": 136881152, - "heapUsed": 97938297, - "external": 85332601 - } - }, - { - "id": 18, - "time": 1765733921458, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 67.80116599999997, - "diffMs": 0.12358300000005329, - "writeMs": 0.0002500000000509317, - "frameMs": 67.9414999999999, - "memory": { - "rss": 1120714752, - "heapTotal": 136881152, - "heapUsed": 97938297, - "external": 85332601 - } - }, - { - "id": 19, - "time": 1765733921526, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 69.498875, - "diffMs": 0.11337499999990541, - "writeMs": 0.0002080000001569715, - "frameMs": 69.62658299999998, - "memory": { - "rss": 1120714752, - "heapTotal": 136881152, - "heapUsed": 97939290, - "external": 85332634 - } - }, - { - "id": 20, - "time": 1765733921596, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 69.67025000000012, - "diffMs": 0.12183299999992414, - "writeMs": 0.0002500000000509317, - "frameMs": 69.80666700000006, - "memory": { - "rss": 1120714752, - "heapTotal": 136881152, - "heapUsed": 97939723, - "external": 85332667 - } - }, - { - "id": 21, - "time": 1765733921667, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 25, - "diffCellsChanged": 2, - "diffOps": 4, - "diffCursorMoves": 2, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 69.36691700000006, - "diffMs": 0.1198749999998654, - "writeMs": 0.00033400000006622577, - "frameMs": 69.49816699999997, - "memory": { - "rss": 1120714752, - "heapTotal": 136881152, - "heapUsed": 97940412, - "external": 85332700 - } - }, - { - "id": 22, - "time": 1765733921736, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 67.45762500000001, - "diffMs": 0.11062500000002728, - "writeMs": 0.0002909999998337298, - "frameMs": 67.58400000000006, - "memory": { - "rss": 1120714752, - "heapTotal": 136881152, - "heapUsed": 97940412, - "external": 85332700 - } - }, - { - "id": 23, - "time": 1765733921804, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 69.70658400000002, - "diffMs": 0.12929099999996652, - "writeMs": 0.0003749999998490239, - "frameMs": 69.85037500000021, - "memory": { - "rss": 1120714752, - "heapTotal": 136881152, - "heapUsed": 97941213, - "external": 85332733 - } - }, - { - "id": 24, - "time": 1765733921874, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 69.23329199999989, - "diffMs": 0.11579099999994469, - "writeMs": 0.0003339999998388521, - "frameMs": 69.3627919999999, - "memory": { - "rss": 1120714752, - "heapTotal": 136881152, - "heapUsed": 97941550, - "external": 85332766 - } - }, - { - "id": 25, - "time": 1765733921944, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 68.91225000000009, - "diffMs": 0.1219579999999496, - "writeMs": 0.00016699999991942605, - "frameMs": 69.046875, - "memory": { - "rss": 1120714752, - "heapTotal": 136881152, - "heapUsed": 97941887, - "external": 85332799 - } - }, - { - "id": 26, - "time": 1765733922013, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 69.56475, - "diffMs": 0.11904200000003584, - "writeMs": 0.00033400000006622577, - "frameMs": 69.69804099999988, - "memory": { - "rss": 1120714752, - "heapTotal": 136897536, - "heapUsed": 97941887, - "external": 85332799 - } - }, - { - "id": 27, - "time": 1765733922084, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 69.41020800000001, - "diffMs": 0.1058339999999589, - "writeMs": 0.0003329999999550637, - "frameMs": 69.52983299999983, - "memory": { - "rss": 1120714752, - "heapTotal": 136897536, - "heapUsed": 97943400, - "external": 85333320 - } - }, - { - "id": 28, - "time": 1765733922153, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 69.6111249999999, - "diffMs": 0.12312500000007276, - "writeMs": 0.0003339999998388521, - "frameMs": 69.74566699999991, - "memory": { - "rss": 1120714752, - "heapTotal": 136897536, - "heapUsed": 97943737, - "external": 85333353 - } - }, - { - "id": 29, - "time": 1765733922224, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 72.29958299999998, - "diffMs": 0.13699999999971624, - "writeMs": 0.0003749999996216502, - "frameMs": 72.45391700000027, - "memory": { - "rss": 1120714752, - "heapTotal": 136897536, - "heapUsed": 97944210, - "external": 85333474 - } - }, - { - "id": 30, - "time": 1765733922296, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 72.70749999999998, - "diffMs": 0.12808300000006057, - "writeMs": 0.00037500000007639755, - "frameMs": 72.84904200000028, - "memory": { - "rss": 1120714752, - "heapTotal": 136897536, - "heapUsed": 97944210, - "external": 85333474 - } - }, - { - "id": 31, - "time": 1765733922369, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 25, - "diffCellsChanged": 2, - "diffOps": 4, - "diffCursorMoves": 2, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 70.03950000000032, - "diffMs": 0.1230000000000473, - "writeMs": 0.00037500000007639755, - "frameMs": 70.1761660000002, - "memory": { - "rss": 1120714752, - "heapTotal": 136897536, - "heapUsed": 97945011, - "external": 85333507 - } - }, - { - "id": 32, - "time": 1765733922440, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 71.00808299999971, - "diffMs": 0.11895899999990434, - "writeMs": 0.0002500000000509317, - "frameMs": 71.13962500000025, - "memory": { - "rss": 1120714752, - "heapTotal": 136897536, - "heapUsed": 97945348, - "external": 85333540 - } - }, - { - "id": 33, - "time": 1765733922512, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 70.46216699999968, - "diffMs": 0.1119170000001759, - "writeMs": 0.00041599999985919567, - "frameMs": 70.59100000000035, - "memory": { - "rss": 1120714752, - "heapTotal": 136897536, - "heapUsed": 97946117, - "external": 85333573 - } - }, - { - "id": 34, - "time": 1765733922582, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 70.4882090000001, - "diffMs": 0.11329200000000128, - "writeMs": 0.0009579999996276456, - "frameMs": 70.62608399999999, - "memory": { - "rss": 1120747520, - "heapTotal": 136913920, - "heapUsed": 97946117, - "external": 85333573 - } - }, - { - "id": 35, - "time": 1765733922653, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 70.07045799999969, - "diffMs": 0.11295799999970768, - "writeMs": 0.02420799999981682, - "frameMs": 70.23170899999968, - "memory": { - "rss": 1120796672, - "heapTotal": 136913920, - "heapUsed": 97946918, - "external": 85333606 - } - }, - { - "id": 36, - "time": 1765733922724, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 69.74675000000025, - "diffMs": 0.12191699999993943, - "writeMs": 0.00045799999998052954, - "frameMs": 69.907917, - "memory": { - "rss": 1120796672, - "heapTotal": 136913920, - "heapUsed": 97948223, - "external": 85333999 - } - }, - { - "id": 37, - "time": 1765733922794, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 69.2060419999998, - "diffMs": 0.11749999999983629, - "writeMs": 0.00045799999998052954, - "frameMs": 69.33916700000009, - "memory": { - "rss": 1120796672, - "heapTotal": 136913920, - "heapUsed": 97949424, - "external": 85334032 - } - }, - { - "id": 38, - "time": 1765733922864, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 78.13075000000026, - "diffMs": 0.11283300000013696, - "writeMs": 0.0007089999999152496, - "frameMs": 78.26537499999995, - "memory": { - "rss": 1120796672, - "heapTotal": 136913920, - "heapUsed": 97949424, - "external": 85334032 - } - }, - { - "id": 39, - "time": 1765733922942, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 69.55433300000004, - "diffMs": 0.11774999999988722, - "writeMs": 0.0005420000002231973, - "frameMs": 69.68712500000038, - "memory": { - "rss": 1120796672, - "heapTotal": 136913920, - "heapUsed": 97950321, - "external": 85334065 - } - }, - { - "id": 40, - "time": 1765733923012, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 68.921292, - "diffMs": 0.10562500000014552, - "writeMs": 0.0003749999996216502, - "frameMs": 69.04149999999981, - "memory": { - "rss": 1120796672, - "heapTotal": 136913920, - "heapUsed": 97950658, - "external": 85334098 - } - }, - { - "id": 41, - "time": 1765733923082, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 25, - "diffCellsChanged": 2, - "diffOps": 4, - "diffCursorMoves": 2, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 68.68566699999974, - "diffMs": 0.11133300000028612, - "writeMs": 0.0005000000001018634, - "frameMs": 68.81395799999973, - "memory": { - "rss": 1120796672, - "heapTotal": 136913920, - "heapUsed": 97950995, - "external": 85334131 - } - }, - { - "id": 42, - "time": 1765733923151, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 69.57729199999994, - "diffMs": 0.11216700000022684, - "writeMs": 0.00041599999985919567, - "frameMs": 69.70241600000008, - "memory": { - "rss": 1120796672, - "heapTotal": 136913920, - "heapUsed": 97950995, - "external": 85334131 - } - }, - { - "id": 43, - "time": 1765733923221, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 69.59212499999967, - "diffMs": 0.11787499999991269, - "writeMs": 0.00037500000007639755, - "frameMs": 69.72329199999967, - "memory": { - "rss": 1120796672, - "heapTotal": 136913920, - "heapUsed": 97951813, - "external": 85334165 - } - }, - { - "id": 44, - "time": 1765733923291, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 68.94875000000002, - "diffMs": 0.11591700000008132, - "writeMs": 0.0005409999998846615, - "frameMs": 69.0783749999996, - "memory": { - "rss": 1120796672, - "heapTotal": 136913920, - "heapUsed": 97951813, - "external": 85334165 - } - }, - { - "id": 45, - "time": 1765733923360, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 69.20912499999986, - "diffMs": 0.10883300000023155, - "writeMs": 0.00020799999992959783, - "frameMs": 69.33137499999975, - "memory": { - "rss": 1120796672, - "heapTotal": 136913920, - "heapUsed": 97952392, - "external": 85334200 - } - }, - { - "id": 46, - "time": 1765733923430, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 69.3921250000003, - "diffMs": 0.10895800000025702, - "writeMs": 0.0008339999999407155, - "frameMs": 69.51433300000008, - "memory": { - "rss": 1120796672, - "heapTotal": 136913920, - "heapUsed": 97953002, - "external": 85334234 - } - }, - { - "id": 47, - "time": 1765733923500, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 70.14100000000008, - "diffMs": 0.11024999999972351, - "writeMs": 0.0002500000000509317, - "frameMs": 70.26283300000023, - "memory": { - "rss": 1120796672, - "heapTotal": 136913920, - "heapUsed": 97953356, - "external": 85334268 - } - }, - { - "id": 48, - "time": 1765733923570, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 68.91258300000027, - "diffMs": 0.10816600000043763, - "writeMs": 0.007916999999906693, - "frameMs": 69.0851660000003, - "memory": { - "rss": 1120813056, - "heapTotal": 136913920, - "heapUsed": 97953710, - "external": 85334302 - } - }, - { - "id": 49, - "time": 1765733923640, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 69.38470899999993, - "diffMs": 0.12170800000012605, - "writeMs": 0.0019160000001647859, - "frameMs": 69.52195799999981, - "memory": { - "rss": 1120813056, - "heapTotal": 136913920, - "heapUsed": 97953710, - "external": 85334302 - } - }, - { - "id": 50, - "time": 1765733923709, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 75.32229099999995, - "diffMs": 0.13237500000013824, - "writeMs": 0.0006669999997939158, - "frameMs": 75.48483299999998, - "memory": { - "rss": 1120813056, - "heapTotal": 136913920, - "heapUsed": 97959233, - "external": 85338577 - } - }, - { - "id": 51, - "time": 1765733923785, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 25, - "diffCellsChanged": 2, - "diffOps": 4, - "diffCursorMoves": 2, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 71.34912500000019, - "diffMs": 0.12533299999995506, - "writeMs": 0.0005839999998897838, - "frameMs": 71.51216599999998, - "memory": { - "rss": 1120813056, - "heapTotal": 136913920, - "heapUsed": 97961051, - "external": 85339403 - } - }, - { - "id": 52, - "time": 1765733923857, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 70.9816249999999, - "diffMs": 0.10779100000036124, - "writeMs": 0.0004170000001977314, - "frameMs": 71.10104100000035, - "memory": { - "rss": 1120813056, - "heapTotal": 136913920, - "heapUsed": 97962597, - "external": 85340181 - } - }, - { - "id": 53, - "time": 1765733923929, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 69.150083, - "diffMs": 0.11504199999990306, - "writeMs": 0.0005420000002231973, - "frameMs": 69.27895799999988, - "memory": { - "rss": 1120813056, - "heapTotal": 136913920, - "heapUsed": 97962597, - "external": 85340181 - } - }, - { - "id": 54, - "time": 1765733923998, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 70.532917, - "diffMs": 0.11016699999981938, - "writeMs": 0.0003329999999550637, - "frameMs": 70.65570800000023, - "memory": { - "rss": 1120813056, - "heapTotal": 136913920, - "heapUsed": 97964944, - "external": 85341280 - } - }, - { - "id": 55, - "time": 1765733924069, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 71.34574999999995, - "diffMs": 0.12387500000022555, - "writeMs": 0.0005000000001018634, - "frameMs": 71.48366699999997, - "memory": { - "rss": 1120813056, - "heapTotal": 136913920, - "heapUsed": 97966178, - "external": 85341314 - } - }, - { - "id": 56, - "time": 1765733924141, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 71.19074999999975, - "diffMs": 0.1125000000001819, - "writeMs": 0.0002500000000509317, - "frameMs": 71.3144169999996, - "memory": { - "rss": 1120813056, - "heapTotal": 136913920, - "heapUsed": 97966532, - "external": 85341348 - } - }, - { - "id": 57, - "time": 1765733924213, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 71.411791, - "diffMs": 0.12874999999985448, - "writeMs": 0.0005419999997684499, - "frameMs": 71.55633400000033, - "memory": { - "rss": 1120813056, - "heapTotal": 136913920, - "heapUsed": 97968333, - "external": 85341389 - } - }, - { - "id": 58, - "time": 1765733924285, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 71.34975000000031, - "diffMs": 0.1172500000002401, - "writeMs": 0.00029100000028847717, - "frameMs": 71.48083399999996, - "memory": { - "rss": 1120813056, - "heapTotal": 136913920, - "heapUsed": 97968654, - "external": 85341406 - } - }, - { - "id": 59, - "time": 1765733924356, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 69.57925000000068, - "diffMs": 0.11404099999981554, - "writeMs": 0.0005000000001018634, - "frameMs": 69.70754100000067, - "memory": { - "rss": 1120813056, - "heapTotal": 136930304, - "heapUsed": 97968654, - "external": 85341406 - } - }, - { - "id": 60, - "time": 1765733924426, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 70.50420800000029, - "diffMs": 0.10850000000027649, - "writeMs": 0.0006669999993391684, - "frameMs": 70.62775000000056, - "memory": { - "rss": 1120813056, - "heapTotal": 136930304, - "heapUsed": 97969233, - "external": 85341441 - } - }, - { - "id": 61, - "time": 1765733924497, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 25, - "diffCellsChanged": 2, - "diffOps": 4, - "diffCursorMoves": 2, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 71.04075000000012, - "diffMs": 0.10554199999933189, - "writeMs": 0.00020799999947485048, - "frameMs": 71.15829200000007, - "memory": { - "rss": 1120813056, - "heapTotal": 136930304, - "heapUsed": 97969587, - "external": 85341475 - } - }, - { - "id": 62, - "time": 1765733924569, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 71.37566700000025, - "diffMs": 0.11270899999999529, - "writeMs": 0.0006249999996725819, - "frameMs": 71.50441600000067, - "memory": { - "rss": 1120813056, - "heapTotal": 136930304, - "heapUsed": 97970197, - "external": 85341509 - } - }, - { - "id": 63, - "time": 1765733924640, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 70.53949999999986, - "diffMs": 0.13008300000001327, - "writeMs": 0.0006249999996725819, - "frameMs": 70.6865829999997, - "memory": { - "rss": 1120813056, - "heapTotal": 136930304, - "heapUsed": 97970197, - "external": 85341509 - } - }, - { - "id": 64, - "time": 1765733924712, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 73.3341249999994, - "diffMs": 0.1207910000002812, - "writeMs": 0.0005830000000059954, - "frameMs": 73.47245800000019, - "memory": { - "rss": 1120813056, - "heapTotal": 136930304, - "heapUsed": 97970776, - "external": 85341544 - } - }, - { - "id": 65, - "time": 1765733924785, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 71.2661250000001, - "diffMs": 0.11904199999935372, - "writeMs": 0.0006249999996725819, - "frameMs": 71.40008300000045, - "memory": { - "rss": 1120813056, - "heapTotal": 136930304, - "heapUsed": 97971130, - "external": 85341578 - } - }, - { - "id": 66, - "time": 1765733924857, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 71.47033300000021, - "diffMs": 0.10237499999948341, - "writeMs": 0.0004580000004352769, - "frameMs": 71.58716699999968, - "memory": { - "rss": 1120813056, - "heapTotal": 136930304, - "heapUsed": 97971740, - "external": 85341612 - } - }, - { - "id": 67, - "time": 1765733924929, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 69.61225000000013, - "diffMs": 0.11295799999970768, - "writeMs": 0.0002919999997175182, - "frameMs": 69.7372089999999, - "memory": { - "rss": 1120813056, - "heapTotal": 136930304, - "heapUsed": 97971740, - "external": 85341612 - } - }, - { - "id": 68, - "time": 1765733924999, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 70.28983399999925, - "diffMs": 0.10350000000016735, - "writeMs": 0.0003329999999550637, - "frameMs": 70.40620900000067, - "memory": { - "rss": 1120813056, - "heapTotal": 136930304, - "heapUsed": 97972319, - "external": 85341647 - } - }, - { - "id": 69, - "time": 1765733925070, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 70.72091699999964, - "diffMs": 0.11270899999999529, - "writeMs": 0.0003750000005311449, - "frameMs": 70.8466670000007, - "memory": { - "rss": 1120813056, - "heapTotal": 136930304, - "heapUsed": 97972673, - "external": 85341681 - } - }, - { - "id": 70, - "time": 1765733925141, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 70.56529200000023, - "diffMs": 0.1025419999996302, - "writeMs": 0.00045899999986431794, - "frameMs": 70.6772920000003, - "memory": { - "rss": 1120813056, - "heapTotal": 136930304, - "heapUsed": 97973283, - "external": 85341715 - } - }, - { - "id": 71, - "time": 1765733925212, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 25, - "diffCellsChanged": 2, - "diffOps": 4, - "diffCursorMoves": 2, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 71.46125000000029, - "diffMs": 0.10695799999939481, - "writeMs": 0.0003749999996216502, - "frameMs": 71.57966699999997, - "memory": { - "rss": 1120813056, - "heapTotal": 136930304, - "heapUsed": 97974828, - "external": 85341756 - } - }, - { - "id": 72, - "time": 1765733925284, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 71.03662500000064, - "diffMs": 0.12466699999913544, - "writeMs": 0.0006250000005820766, - "frameMs": 71.17741699999988, - "memory": { - "rss": 1120813056, - "heapTotal": 136930304, - "heapUsed": 97975157, - "external": 85341781 - } - }, - { - "id": 73, - "time": 1765733925355, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 69.71837499999947, - "diffMs": 0.10433300000022427, - "writeMs": 0.0004169999992882367, - "frameMs": 69.83470800000032, - "memory": { - "rss": 1120813056, - "heapTotal": 136930304, - "heapUsed": 97975157, - "external": 85341781 - } - }, - { - "id": 74, - "time": 1765733925425, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 71.05270800000017, - "diffMs": 0.109375, - "writeMs": 0.0005830000000059954, - "frameMs": 71.17658399999982, - "memory": { - "rss": 1120813056, - "heapTotal": 136930304, - "heapUsed": 97975992, - "external": 85341816 - } - }, - { - "id": 75, - "time": 1765733925497, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 70.82579200000055, - "diffMs": 0.10070900000027905, - "writeMs": 0.000249999999141437, - "frameMs": 70.93808400000034, - "memory": { - "rss": 1120813056, - "heapTotal": 136930304, - "heapUsed": 97976346, - "external": 85341850 - } - }, - { - "id": 76, - "time": 1765733925568, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 70.2588340000002, - "diffMs": 0.10720800000035524, - "writeMs": 0.0005000000001018634, - "frameMs": 70.37716699999964, - "memory": { - "rss": 1120813056, - "heapTotal": 136930304, - "heapUsed": 97976700, - "external": 85341884 - } - }, - { - "id": 77, - "time": 1765733925639, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 70.28304200000002, - "diffMs": 0.10499999999956344, - "writeMs": 0.00045899999986431794, - "frameMs": 70.40087499999936, - "memory": { - "rss": 1120813056, - "heapTotal": 136930304, - "heapUsed": 97976700, - "external": 85341884 - } - }, - { - "id": 78, - "time": 1765733925710, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 71.43133300000045, - "diffMs": 0.1054999999996653, - "writeMs": 0.0003329999999550637, - "frameMs": 71.55099999999948, - "memory": { - "rss": 1120813056, - "heapTotal": 136930304, - "heapUsed": 97977535, - "external": 85341919 - } - }, - { - "id": 79, - "time": 1765733925781, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 71.44925000000057, - "diffMs": 0.11112500000035652, - "writeMs": 0.0004999999991923687, - "frameMs": 71.57437500000015, - "memory": { - "rss": 1120813056, - "heapTotal": 136930304, - "heapUsed": 97977889, - "external": 85341953 - } - }, - { - "id": 80, - "time": 1765733925853, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 70.8633749999999, - "diffMs": 0.1156250000003638, - "writeMs": 0.0002500000000509317, - "frameMs": 70.99029200000041, - "memory": { - "rss": 1120813056, - "heapTotal": 136930304, - "heapUsed": 97978243, - "external": 85341987 - } - }, - { - "id": 81, - "time": 1765733925925, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 25, - "diffCellsChanged": 2, - "diffOps": 4, - "diffCursorMoves": 2, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 69.19666599999982, - "diffMs": 0.1092079999998532, - "writeMs": 0.0005000000001018634, - "frameMs": 69.31887499999993, - "memory": { - "rss": 1120813056, - "heapTotal": 136930304, - "heapUsed": 97978243, - "external": 85341987 - } - }, - { - "id": 82, - "time": 1765733925994, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 71.90999999999985, - "diffMs": 0.1101249999992433, - "writeMs": 0.00029100000028847717, - "frameMs": 72.03441699999985, - "memory": { - "rss": 1120813056, - "heapTotal": 136930304, - "heapUsed": 97979078, - "external": 85342022 - } - }, - { - "id": 83, - "time": 1765733926067, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 71.26400000000012, - "diffMs": 0.10941599999932805, - "writeMs": 0.0005000000001018634, - "frameMs": 71.38875000000007, - "memory": { - "rss": 1120829440, - "heapTotal": 136930304, - "heapUsed": 97979432, - "external": 85342056 - } - }, - { - "id": 84, - "time": 1765733926138, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 70.96279200000026, - "diffMs": 0.10570800000004965, - "writeMs": 0.0005000000001018634, - "frameMs": 71.07991700000002, - "memory": { - "rss": 1120829440, - "heapTotal": 136930304, - "heapUsed": 97981906, - "external": 85343986 - } - }, - { - "id": 85, - "time": 1765733926210, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 72.71125000000029, - "diffMs": 0.12095899999985704, - "writeMs": 0.0002920000006270129, - "frameMs": 72.847084, - "memory": { - "rss": 1120829440, - "heapTotal": 136930304, - "heapUsed": 97983707, - "external": 85344027 - } - }, - { - "id": 86, - "time": 1765733926283, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 72.18654200000037, - "diffMs": 0.11612499999955617, - "writeMs": 0.00029100000028847717, - "frameMs": 72.31520799999998, - "memory": { - "rss": 1120829440, - "heapTotal": 136930304, - "heapUsed": 97984028, - "external": 85344044 - } - }, - { - "id": 87, - "time": 1765733926355, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 70.01666599999953, - "diffMs": 0.11074999999982538, - "writeMs": 0.0004580000004352769, - "frameMs": 70.14091599999938, - "memory": { - "rss": 1120829440, - "heapTotal": 136930304, - "heapUsed": 97984028, - "external": 85344044 - } - }, - { - "id": 88, - "time": 1765733926426, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 71.8720830000002, - "diffMs": 0.1106660000004922, - "writeMs": 0.0007079999995767139, - "frameMs": 71.99799999999959, - "memory": { - "rss": 1120829440, - "heapTotal": 136930304, - "heapUsed": 97984607, - "external": 85344079 - } - }, - { - "id": 89, - "time": 1765733926498, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 71.68437500000073, - "diffMs": 0.109958000000006, - "writeMs": 0.0004170000001977314, - "frameMs": 71.80566700000054, - "memory": { - "rss": 1120829440, - "heapTotal": 136930304, - "heapUsed": 97984961, - "external": 85344113 - } - }, - { - "id": 90, - "time": 1765733926570, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 71.31354199999987, - "diffMs": 0.11041699999987031, - "writeMs": 0.0005419999997684499, - "frameMs": 71.43837499999972, - "memory": { - "rss": 1120829440, - "heapTotal": 136930304, - "heapUsed": 97985571, - "external": 85344147 - } - }, - { - "id": 91, - "time": 1765733926642, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 25, - "diffCellsChanged": 2, - "diffOps": 4, - "diffCursorMoves": 2, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 69.41054199999962, - "diffMs": 0.11370799999986048, - "writeMs": 0.0003329999999550637, - "frameMs": 69.53620800000044, - "memory": { - "rss": 1120829440, - "heapTotal": 136930304, - "heapUsed": 97985571, - "external": 85344147 - } - }, - { - "id": 92, - "time": 1765733926712, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 71.48937500000011, - "diffMs": 0.11999999999989086, - "writeMs": 0.0006249999996725819, - "frameMs": 71.62387500000023, - "memory": { - "rss": 1120829440, - "heapTotal": 136930304, - "heapUsed": 97986150, - "external": 85344182 - } - }, - { - "id": 93, - "time": 1765733926784, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 71.73654200000055, - "diffMs": 0.10891699999956472, - "writeMs": 0.0004579999995257822, - "frameMs": 71.86083299999973, - "memory": { - "rss": 1120829440, - "heapTotal": 136930304, - "heapUsed": 97986504, - "external": 85344216 - } - }, - { - "id": 94, - "time": 1765733926856, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 71.20204199999989, - "diffMs": 0.10962500000005093, - "writeMs": 0.0003750000005311449, - "frameMs": 71.32316600000013, - "memory": { - "rss": 1120829440, - "heapTotal": 136930304, - "heapUsed": 97987114, - "external": 85344250 - } - }, - { - "id": 95, - "time": 1765733926927, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 69.23733300000004, - "diffMs": 0.11133299999983137, - "writeMs": 0.0005409999994299142, - "frameMs": 69.36208399999941, - "memory": { - "rss": 1120829440, - "heapTotal": 136930304, - "heapUsed": 97987114, - "external": 85344250 - } - }, - { - "id": 96, - "time": 1765733926997, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 70.74866699999984, - "diffMs": 0.11079200000040146, - "writeMs": 0.0005000000001018634, - "frameMs": 70.87045900000066, - "memory": { - "rss": 1120829440, - "heapTotal": 136930304, - "heapUsed": 97988293, - "external": 85344661 - } - }, - { - "id": 97, - "time": 1765733927068, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 71.2742500000004, - "diffMs": 0.10816699999941193, - "writeMs": 0.00020800000038434519, - "frameMs": 71.39291700000012, - "memory": { - "rss": 1120829440, - "heapTotal": 136930304, - "heapUsed": 97988647, - "external": 85344695 - } - }, - { - "id": 98, - "time": 1765733927140, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 72.38925000000017, - "diffMs": 0.11295900000004622, - "writeMs": 0.015582999999423919, - "frameMs": 72.53145900000072, - "memory": { - "rss": 1120829440, - "heapTotal": 136930304, - "heapUsed": 97989257, - "external": 85344729 - } - }, - { - "id": 99, - "time": 1765733927213, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 71.51408300000003, - "diffMs": 0.1334999999999127, - "writeMs": 0.011958000000049651, - "frameMs": 71.67075000000023, - "memory": { - "rss": 1120829440, - "heapTotal": 136930304, - "heapUsed": 97991026, - "external": 85344770 - } - }, - { - "id": 100, - "time": 1765733927285, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 72.39520900000025, - "diffMs": 0.10870900000008987, - "writeMs": 0.0006249999996725819, - "frameMs": 72.51966700000048, - "memory": { - "rss": 1120829440, - "heapTotal": 136930304, - "heapUsed": 97991347, - "external": 85344787 - } - }, - { - "id": 101, - "time": 1765733927358, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 33, - "diffCellsChanged": 3, - "diffOps": 5, - "diffCursorMoves": 3, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 69.72724999999991, - "diffMs": 0.13595900000018446, - "writeMs": 0.0028750000001309672, - "frameMs": 69.88395800000035, - "memory": { - "rss": 1120845824, - "heapTotal": 136930304, - "heapUsed": 97991347, - "external": 85344787 - } - }, - { - "id": 102, - "time": 1765733927428, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 72.3774169999997, - "diffMs": 0.11795900000015536, - "writeMs": 0.00016599999980826396, - "frameMs": 72.53349999999955, - "memory": { - "rss": 1120845824, - "heapTotal": 136946688, - "heapUsed": 98003809, - "external": 85353073 - } - }, - { - "id": 103, - "time": 1765733927501, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 71.75429200000053, - "diffMs": 0.10754199999973935, - "writeMs": 0.00020899999981338624, - "frameMs": 71.8734999999997, - "memory": { - "rss": 1120845824, - "heapTotal": 136946688, - "heapUsed": 98005132, - "external": 85353852 - } - }, - { - "id": 104, - "time": 1765733927573, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 71.99499999999989, - "diffMs": 0.11204099999940809, - "writeMs": 0.00016699999923730502, - "frameMs": 72.11862500000007, - "memory": { - "rss": 1120845824, - "heapTotal": 136946688, - "heapUsed": 98005487, - "external": 85353887 - } - }, - { - "id": 105, - "time": 1765733927645, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 69.5649169999997, - "diffMs": 0.11766699999952834, - "writeMs": 0.00004199999966658652, - "frameMs": 69.69208299999991, - "memory": { - "rss": 1120845824, - "heapTotal": 136946688, - "heapUsed": 98005487, - "external": 85353887 - } - }, - { - "id": 106, - "time": 1765733927715, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 72.17745800000012, - "diffMs": 0.10775000000012369, - "writeMs": 0.0001249999995707185, - "frameMs": 72.29550000000017, - "memory": { - "rss": 1120845824, - "heapTotal": 136946688, - "heapUsed": 98006323, - "external": 85353923 - } - }, - { - "id": 107, - "time": 1765733927788, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 74.51858300000004, - "diffMs": 0.11049999999977445, - "writeMs": 0.00008299999990413198, - "frameMs": 74.6436249999997, - "memory": { - "rss": 1120845824, - "heapTotal": 136946688, - "heapUsed": 98006678, - "external": 85353958 - } - }, - { - "id": 108, - "time": 1765733927863, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 73.43720800000028, - "diffMs": 0.10574999999971624, - "writeMs": 0.0001249999995707185, - "frameMs": 73.55866700000024, - "memory": { - "rss": 1120845824, - "heapTotal": 136946688, - "heapUsed": 98007033, - "external": 85353993 - } - }, - { - "id": 109, - "time": 1765733927936, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 70.35699999999997, - "diffMs": 0.11870900000030815, - "writeMs": 0.00016599999980826396, - "frameMs": 70.48608400000012, - "memory": { - "rss": 1120845824, - "heapTotal": 136946688, - "heapUsed": 98007033, - "external": 85353993 - } - }, - { - "id": 110, - "time": 1765733928007, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 72.00979200000074, - "diffMs": 0.1279579999991256, - "writeMs": 0.00008299999990413198, - "frameMs": 72.1513329999998, - "memory": { - "rss": 1120845824, - "heapTotal": 136946688, - "heapUsed": 98007869, - "external": 85354029 - } - }, - { - "id": 111, - "time": 1765733928080, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 25, - "diffCellsChanged": 2, - "diffOps": 4, - "diffCursorMoves": 2, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 71.27558300000055, - "diffMs": 0.10316700000021228, - "writeMs": 0.00016699999923730502, - "frameMs": 71.3877910000001, - "memory": { - "rss": 1120845824, - "heapTotal": 136946688, - "heapUsed": 98010000, - "external": 85354064 - } - }, - { - "id": 112, - "time": 1765733928152, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 72.05016700000033, - "diffMs": 0.1051660000002812, - "writeMs": 0.0002920000006270129, - "frameMs": 72.16658300000017, - "memory": { - "rss": 1120845824, - "heapTotal": 136946688, - "heapUsed": 98010355, - "external": 85354099 - } - }, - { - "id": 113, - "time": 1765733928224, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 74.12370900000042, - "diffMs": 0.1117500000000291, - "writeMs": 0.0001250000004802132, - "frameMs": 74.24629199999981, - "memory": { - "rss": 1120845824, - "heapTotal": 136946688, - "heapUsed": 98012436, - "external": 85354148 - } - }, - { - "id": 114, - "time": 1765733928299, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 73.06266700000015, - "diffMs": 0.12237499999901047, - "writeMs": 0.00008300000081362668, - "frameMs": 73.19658300000083, - "memory": { - "rss": 1120845824, - "heapTotal": 136946688, - "heapUsed": 98012757, - "external": 85354165 - } - }, - { - "id": 115, - "time": 1765733928372, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 70.25895800000035, - "diffMs": 0.10916700000052515, - "writeMs": 0.00016700000014679972, - "frameMs": 70.378917, - "memory": { - "rss": 1120845824, - "heapTotal": 136979456, - "heapUsed": 98012757, - "external": 85354165 - } - }, - { - "id": 116, - "time": 1765733928443, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 71.50849999999991, - "diffMs": 0.10645800000020245, - "writeMs": 0.00008300000081362668, - "frameMs": 71.62487500000134, - "memory": { - "rss": 1120845824, - "heapTotal": 136979456, - "heapUsed": 98013337, - "external": 85354201 - } - }, - { - "id": 117, - "time": 1765733928515, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 82.11287500000071, - "diffMs": 0.11566700000003038, - "writeMs": 0.0002500000009604264, - "frameMs": 82.23929099999987, - "memory": { - "rss": 1120845824, - "heapTotal": 136979456, - "heapUsed": 98013692, - "external": 85354236 - } - }, - { - "id": 118, - "time": 1765733928597, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 83.2497919999987, - "diffMs": 0.28716700000040873, - "writeMs": 0.0001250000004802132, - "frameMs": 83.55191700000069, - "memory": { - "rss": 1120845824, - "heapTotal": 136979456, - "heapUsed": 98014303, - "external": 85354271 - } - }, - { - "id": 119, - "time": 1765733928681, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 74.48354199999994, - "diffMs": 0.11258300000008603, - "writeMs": 0.0003329999999550637, - "frameMs": 74.60979200000111, - "memory": { - "rss": 1120845824, - "heapTotal": 136979456, - "heapUsed": 98014303, - "external": 85354271 - } - }, - { - "id": 120, - "time": 1765733928756, - "rows": 40, - "cols": 120, - "nodeCount": 10002, - "outputBytes": 17, - "diffCellsChanged": 1, - "diffOps": 3, - "diffCursorMoves": 1, - "diffStyleChanges": 1, - "diffResets": 1, - "diffFullRedraw": false, - "layoutMs": 0, - "renderMs": 73.93204200000037, - "diffMs": 0.11545900000055553, - "writeMs": 0.00016700000014679972, - "frameMs": 74.06354099999953, - "memory": { - "rss": 1120845824, - "heapTotal": 136979456, - "heapUsed": 98017339, - "external": 85356539 - } - } - ], - "summary": { - "frameCount": 120, - "frameMs": { - "p50": 70.8466670000007, - "p95": 74.6436249999997, - "p99": 82.23929099999987, - "max": 127.667292 - }, - "totals": { - "layoutMs": 54.271291000000005, - "renderMs": 8522.248087000007, - "diffMs": 14.32616699999511, - "writeMs": 0.1235779999965132, - "frameMs": 8593.173503000009 - } - } -} \ No newline at end of file diff --git a/scripts/profiler-core.ts b/scripts/profiler-core.ts index a68bcac..0cfce2e 100644 --- a/scripts/profiler-core.ts +++ b/scripts/profiler-core.ts @@ -1,3 +1,5 @@ +import type { TerminalAdapter } from "../packages/btuin/src/runtime"; + type FrameMetrics = { id: number; time: number; @@ -42,6 +44,22 @@ export type ProfilerLog = { }; }; +export function createNullTerminalAdapter(size: { rows: number; cols: number }): TerminalAdapter { + return { + setupRawMode() {}, + clearScreen() {}, + cleanupWithoutClear() {}, + patchConsole() {}, + startCapture() {}, + onKey() {}, + getTerminalSize() { + return size; + }, + disposeSingletonCapture() {}, + write() {}, + }; +} + const formatMs = (value: number) => `${value.toFixed(2)}ms`; function describeFrame(frame: FrameMetrics) { diff --git a/scripts/profiler-layout.test.ts b/scripts/profiler-layout.spec.ts similarity index 79% rename from scripts/profiler-layout.test.ts rename to scripts/profiler-layout.spec.ts index a694456..c70dd2c 100644 --- a/scripts/profiler-layout.test.ts +++ b/scripts/profiler-layout.spec.ts @@ -1,8 +1,8 @@ import { test, describe, expect } from "bun:test"; import { existsSync } from "node:fs"; -import { createApp, ref, Block, Text, type TerminalAdapter } from "../packages/btuin"; -import { printSummary, type ProfilerLog } from "./profiler-core"; +import { createApp, ref, Block, Text } from "../packages/btuin"; +import { createNullTerminalAdapter, printSummary, type ProfilerLog } from "./profiler-core"; // This test intentionally mutates layout-relevant props every frame to stress: // - view() construction cost @@ -23,22 +23,6 @@ const finished = new Promise((resolve) => { resolveFinished = resolve; }); -function createNullTerminalAdapter(size: { rows: number; cols: number }): TerminalAdapter { - return { - setupRawMode() {}, - clearScreen() {}, - cleanupWithoutClear() {}, - patchConsole() {}, - startCapture() {}, - onKey() {}, - getTerminalSize() { - return size; - }, - disposeSingletonCapture() {}, - write() {}, - }; -} - // Reuse leaf Text nodes to avoid making this purely an allocation benchmark. const leaves = Array.from({ length: n }, (_, i) => Text(`item ${i}`).foreground("gray")); @@ -114,12 +98,13 @@ describe("Layout Change Stress Test", () => { { timeout: 60_000 }, ); - test("parsable jsonfile", async () => { + test("Performance Requirements", async () => { const log = await import(`../${out}`, { with: { type: "json" } }) as ProfilerLog - expect(log.startedAt).toBeDefined(); - expect(log.endedAt).toBeDefined(); - expect(log.frames).toBeDefined(); - expect(log.frames.length).toEqual(frames); printSummary(log); + expect(log.summary.totals.frameMs / log.summary.frameCount).toBeLessThan(33.4) + expect(log.summary.frameMs.max).toBeLessThan(50) + expect(log.summary.frameMs.p99).toBeGreaterThan(33.4) + expect(log.summary.frameMs.p95).toBeLessThan(30) + expect(log.summary.frameMs.p50).toBeLessThan(25) }); }); diff --git a/scripts/profiler-stress.test.ts b/scripts/profiler-stress.spec.ts similarity index 71% rename from scripts/profiler-stress.test.ts rename to scripts/profiler-stress.spec.ts index ec3bf32..d980b89 100644 --- a/scripts/profiler-stress.test.ts +++ b/scripts/profiler-stress.spec.ts @@ -2,7 +2,7 @@ import { test, describe, expect } from "bun:test"; import { existsSync } from "node:fs"; import { createApp, ref, Block, Text, type TerminalAdapter } from "../packages/btuin"; -import { printSummary, type ProfilerLog } from "./profiler-core"; +import { createNullTerminalAdapter, printSummary, type ProfilerLog } from "./profiler-core"; const n = 10_000; const frames = 120; @@ -16,22 +16,6 @@ const finished = new Promise((resolve) => { resolveFinished = resolve; }); -function createNullTerminalAdapter(size: { rows: number; cols: number }): TerminalAdapter { - return { - setupRawMode() {}, - clearScreen() {}, - cleanupWithoutClear() {}, - patchConsole() {}, - startCapture() {}, - onKey() {}, - getTerminalSize() { - return size; - }, - disposeSingletonCapture() {}, - write() {}, - }; -} - // Pre-build a large, mostly-static tree to stress layout+render traversal. const items = Array.from({ length: n }, (_, i) => Text(`item ${i}`).foreground("gray")); const header = Text("stress").foreground("cyan"); @@ -66,7 +50,7 @@ const app = createApp({ }, }); -describe("Profiler Stress Test", () => { +describe("Profiler Stress Test", async () => { test( "should run without errors", async () => { @@ -79,12 +63,13 @@ describe("Profiler Stress Test", () => { { timeout: 45_000 }, ); - test("parsable jsonfile", async () => { - const log = await import(`../${out}`, { with: { type: "json" } }) as ProfilerLog; - expect(log.startedAt).toBeDefined(); - expect(log.endedAt).toBeDefined(); - expect(log.frames).toBeDefined(); - expect(log.frames.length).toEqual(frames); + test("Performance Requirements", async () => { + const log = await import(`../${out}`, { with: { type: "json" } }) as ProfilerLog printSummary(log); + expect(log.summary.totals.frameMs / log.summary.frameCount).toBeLessThan(16.7) + expect(log.summary.frameMs.max).toBeLessThan(50) + expect(log.summary.frameMs.p99).toBeGreaterThan(0.2) + expect(log.summary.frameMs.p95).toBeLessThan(0.5) + expect(log.summary.frameMs.p50).toBeLessThan(1) }); }); From 4b66232ea6e94a6c34e4cc8b792b61d33df8b283 Mon Sep 17 00:00:00 2001 From: HAL <68320771+HALQME@users.noreply.github.com> Date: Mon, 15 Dec 2025 10:55:59 +0900 Subject: [PATCH 03/12] Add incremental layout engine and renderer tweaks Implement a stateful, incremental layout engine with a wasm bridge (init_layout_engine, update_nodes, remove_nodes, compute_layout by key) and corresponding Rust stateful implementation. Optimize renderer and buffers: track ASCII-only buffers with FlatBuffer, add ASCII fast-path diffing, avoid diffing the same buffer instance, fall back to a safe full redraw when diff output is empty, and ensure one frame is rendered on mount. Add showcase package and smoke tests (with exit timers) and include it in the test script. Misc profiler and minor test adjustments. --- package.json | 2 +- packages/btuin/src/runtime/app.ts | 4 + packages/btuin/src/runtime/profiler.ts | 4 +- packages/btuin/src/runtime/render-loop.ts | 52 +++-- .../btuin/tests/runtime/render-loop.test.ts | 15 +- packages/layout-engine/Cargo.toml | 3 + packages/layout-engine/src/index.ts | 186 +++++++++++------- packages/layout-engine/src/lib.rs | 168 +++++++++++----- packages/renderer/src/buffer.ts | 13 ++ packages/renderer/src/diff.ts | 88 +++++++++ packages/renderer/src/grid.ts | 1 + packages/showcase/counter.ts | 5 + packages/showcase/dashboard.ts | 5 + packages/showcase/package.json | 4 + .../showcase/tests/showcase-smoke.test.ts | 51 +++++ scripts/profiler-core.ts | 12 +- scripts/profiler-layout.spec.ts | 36 ++-- scripts/profiler-stress.spec.ts | 35 ++-- 18 files changed, 502 insertions(+), 182 deletions(-) create mode 100644 packages/showcase/tests/showcase-smoke.test.ts diff --git a/package.json b/package.json index 2c4ed08..3c7ef20 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "lint": "oxlint packages/*", "lint:fix": "oxlint packages/* --fix", "format": "oxfmt packages/*", - "test": "bun test packages/btuin packages/layout-engine packages/reactivity packages/renderer packages/terminal", + "test": "bun test packages/btuin packages/layout-engine packages/reactivity packages/renderer packages/terminal packages/showcase", "test:watch": "pnpm test --watch", "test:all": "bun test packages", "profiler": "bun test scripts/profiler*.spec.ts", diff --git a/packages/btuin/src/runtime/app.ts b/packages/btuin/src/runtime/app.ts index b50e972..f377046 100644 --- a/packages/btuin/src/runtime/app.ts +++ b/packages/btuin/src/runtime/app.ts @@ -235,6 +235,10 @@ export function createApp(config: AppConfig): AppInstance { } }); + // Ensure at least one frame is rendered during mount, even if no reactive + // dependencies change afterward. + renderer.render(true); + // Flush any key events received during mount. if (pendingKeyEvents.length && mounted) { for (const event of pendingKeyEvents.splice(0)) { diff --git a/packages/btuin/src/runtime/profiler.ts b/packages/btuin/src/runtime/profiler.ts index d151906..9e0ea47 100644 --- a/packages/btuin/src/runtime/profiler.ts +++ b/packages/btuin/src/runtime/profiler.ts @@ -337,7 +337,7 @@ export class Profiler { const dir = path.dirname(this.options.outputFile); if (dir && dir !== ".") { try { - Bun.$`mkdir -p ${dir}`; + const _ = Bun.$`mkdir -p ${dir}`; } catch {} } await Bun.write(this.options.outputFile, output); @@ -350,7 +350,7 @@ export class Profiler { const dir = path.dirname(this.options.outputFile); if (dir && dir !== ".") { try { - Bun.$`mkdir -p ${dir}`; + const _ = Bun.$`mkdir -p ${dir}`; } catch {} } Bun.write(this.options.outputFile, output).then(); diff --git a/packages/btuin/src/runtime/render-loop.ts b/packages/btuin/src/runtime/render-loop.ts index 906ddd8..59a8786 100644 --- a/packages/btuin/src/runtime/render-loop.ts +++ b/packages/btuin/src/runtime/render-loop.ts @@ -4,7 +4,13 @@ * Handles the rendering loop, including buffer management and diff rendering. */ -import { getGlobalBufferPool, renderDiff, type Buffer2D, type DiffStats } from "@btuin/renderer"; +import { + FlatBuffer, + getGlobalBufferPool, + renderDiff, + type Buffer2D, + type DiffStats, +} from "@btuin/renderer"; import { layout, renderElement } from "../layout"; import type { ViewElement } from "../view/types/elements"; import { isBlock } from "../view/types/elements"; @@ -104,7 +110,7 @@ export function createRenderer(config: RenderLoopConfig) { prevLayoutSizeKey === layoutSizeKey && !sizeChanged ? prevLayoutResult - : config.profiler?.measure(frame, "layoutMs", () => + : (config.profiler?.measure(frame, "layoutMs", () => layout(rootElement, { width: state.currentSize.cols, height: state.currentSize.rows, @@ -113,16 +119,27 @@ export function createRenderer(config: RenderLoopConfig) { layout(rootElement, { width: state.currentSize.cols, height: state.currentSize.rows, - }); + })); prevRootElement = rootElement; prevLayoutResult = layoutResult; prevLayoutSizeKey = layoutSizeKey; - const buf = pool.acquire(); - config.profiler?.measure(frame, "renderMs", () => { + let buf = pool.acquire(); + if (buf === state.prevBuffer) { + // Ensure prev/next buffers differ; diffing the same instance yields no output. + buf = pool.acquire(); + if (buf === state.prevBuffer) { + buf = new FlatBuffer(state.currentSize.rows, state.currentSize.cols); + } + } + if (config.profiler && frame) { + config.profiler.measure(frame, "renderMs", () => { + renderElement(rootElement, buf, layoutResult, 0, 0); + }); + } else { renderElement(rootElement, buf, layoutResult, 0, 0); - }); + } config.profiler?.drawHud(buf); @@ -139,16 +156,27 @@ export function createRenderer(config: RenderLoopConfig) { } : undefined; + const prevForDiff = forceFullRedraw + ? new FlatBuffer(state.currentSize.rows, state.currentSize.cols) + : state.prevBuffer; + const output = - config.profiler?.measure(frame, "diffMs", () => - renderDiff(state.prevBuffer, buf, diffStats), - ) ?? renderDiff(state.prevBuffer, buf); + config.profiler?.measure(frame, "diffMs", () => renderDiff(prevForDiff, buf, diffStats)) ?? + renderDiff(prevForDiff, buf); + const safeOutput = + output === "" + ? renderDiff(new FlatBuffer(state.currentSize.rows, state.currentSize.cols), buf) + : output; if (frame && diffStats) { config.profiler?.recordDiffStats(frame, diffStats); } - if (output) { - config.profiler?.recordOutput(frame, output); - config.profiler?.measure(frame, "writeMs", () => config.write(output)); + if (safeOutput) { + config.profiler?.recordOutput(frame, safeOutput); + if (config.profiler && frame) { + config.profiler.measure(frame, "writeMs", () => config.write(safeOutput)); + } else { + config.write(safeOutput); + } } // Return old prev buffer to the pool and keep the new one diff --git a/packages/btuin/tests/runtime/render-loop.test.ts b/packages/btuin/tests/runtime/render-loop.test.ts index 9331b70..afae37d 100644 --- a/packages/btuin/tests/runtime/render-loop.test.ts +++ b/packages/btuin/tests/runtime/render-loop.test.ts @@ -10,19 +10,26 @@ mock.module("../../../src/layout", () => ({ renderElement: () => {}, })); -const mockBuffer: Buffer2D = new FlatBuffer(24, 80); +const mockBufferA: Buffer2D = new FlatBuffer(24, 80); +const mockBufferB: Buffer2D = new FlatBuffer(24, 80); +let acquireCount = 0; const mockPool = { - acquire: () => mockBuffer, + acquire: () => { + acquireCount++; + return acquireCount % 2 === 1 ? mockBufferA : mockBufferB; + }, release: () => {}, }; mock.module("@btuin/renderer", () => ({ + FlatBuffer, getGlobalBufferPool: () => mockPool, - renderDiff: () => "", + renderDiff: () => "x", })); describe("createRenderer", () => { it("should create a renderer and perform a render cycle", () => { + acquireCount = 0; let size = { rows: 24, cols: 80 }; const renderer = createRenderer({ getSize: () => size, @@ -39,7 +46,7 @@ describe("createRenderer", () => { // Render once renderer.render(); state = renderer.getState(); - expect(state.prevBuffer).toBe(mockBuffer); + expect(state.prevBuffer === mockBufferA || state.prevBuffer === mockBufferB).toBe(true); // Change size and re-render size = { rows: 30, cols: 100 }; diff --git a/packages/layout-engine/Cargo.toml b/packages/layout-engine/Cargo.toml index 34a0334..b763d2c 100644 --- a/packages/layout-engine/Cargo.toml +++ b/packages/layout-engine/Cargo.toml @@ -11,3 +11,6 @@ serde = { version = "1.0.228", features = ["derive"] } serde-wasm-bindgen = "0.6.5" taffy = "0.9.2" wasm-bindgen = "0.2.106" + +[package.metadata.wasm-pack.profile.release] +wasm-opt = false diff --git a/packages/layout-engine/src/index.ts b/packages/layout-engine/src/index.ts index df5d827..81562f0 100644 --- a/packages/layout-engine/src/index.ts +++ b/packages/layout-engine/src/index.ts @@ -6,23 +6,15 @@ let wasmInitialized = false; type LayoutEngineWasmModule = { default: (module_or_path?: unknown) => Promise; - compute_layout: (nodes_js: unknown) => unknown; + init_layout_engine: () => void; + update_nodes: (nodes: unknown) => void; + remove_nodes: (keys: unknown) => void; + compute_layout: (root_key: string) => unknown; }; let wasmModule: LayoutEngineWasmModule | null = null; let wasmImportPromise: Promise | null = null; -function nowMs(): number { - const p = (globalThis as any).performance; - if (p && typeof p.now === "function") return p.now(); - return Date.now(); -} - -function isPerfEnabled(): boolean { - const env = (globalThis as any).process?.env; - return env?.BTUIN_LAYOUT_ENGINE_PROFILE === "1" || env?.BTUIN_LAYOUT_ENGINE_PROFILE === "true"; -} - async function loadWasmModule(): Promise { if (wasmModule) return wasmModule; if (wasmImportPromise) return wasmImportPromise; @@ -49,11 +41,16 @@ async function loadWasmModule(): Promise { return wasmImportPromise; } +const layoutState = createLayoutState(); + export async function initLayoutEngine() { - if (wasmInitialized) return; const mod = await loadWasmModule(); - await mod.default(); - wasmInitialized = true; + if (!wasmInitialized) { + await mod.default(); + wasmInitialized = true; + } + mod.init_layout_engine(); + layoutState.reset(); } // ---------------------------------------------------------------------------- @@ -102,12 +99,6 @@ export interface LayoutInputNode extends LayoutElementShape, LayoutStyle { children?: LayoutInputNode[]; } -interface BridgeNode { - style: BridgeStyle; - children: number[]; - measure?: { width: number; height: number }; -} - interface BridgeStyle { display?: string; position?: string; @@ -135,79 +126,132 @@ interface BridgeStyle { // ---------------------------------------------------------------------------- export function computeLayout(root: LayoutInputNode): ComputedLayout { - if (!wasmInitialized) { + if (!wasmInitialized || !wasmModule) { throw new Error("Layout engine not initialized. Call initLayoutEngine() first."); } - if (!wasmModule) { - throw new Error("Layout engine module not loaded. Call initLayoutEngine() first."); + try { + return layoutState.compute(root); + } catch (cause) { + if (cause instanceof Error && /not initialized/i.test(cause.message)) { + throw cause; + } + throw new Error("failed to compute layout", { cause }); } +} - const perfEnabled = isPerfEnabled(); - const t0 = perfEnabled ? nowMs() : 0; +interface BridgeNodePayload { + key: string; + style: BridgeStyle; + children: string[]; + measure?: { width: number; height: number }; +} - const nodes: BridgeNode[] = []; - const elementMap = new Map(); +function createLayoutState() { + let signatures = new Map(); - flattenTree(root, nodes, elementMap); + function reset() { + signatures = new Map(); + } - const t1 = perfEnabled ? nowMs() : 0; + function compute(root: LayoutInputNode): ComputedLayout { + const module = getReadyModule(); + const nodes: BridgeNodePayload[] = []; + flattenBridgeNodes(root, nodes); - let rawResults: any[]; - try { - rawResults = wasmModule.compute_layout(nodes) as any[]; - } catch (cause) { - throw new Error("Layout computation failed.", { cause }); - } + if (nodes.length === 0 || !nodes[0]) { + throw new Error("Layout tree must contain at least one node."); + } - const t2 = perfEnabled ? nowMs() : 0; - - const computed: ComputedLayout = {}; - rawResults.forEach((res: any, index: number) => { - const key = elementMap.get(index); - if (key) { - computed[key] = { - x: res.x, - y: res.y, - width: res.width, - height: res.height, - }; + const newSignatures = new Map(); + const currentKeys = new Set(); + const changedNodes: BridgeNodePayload[] = []; + + for (const node of nodes) { + const signature = createSignature(node); + newSignatures.set(node.key, signature); + currentKeys.add(node.key); + if (signatures.get(node.key) !== signature) { + changedNodes.push(node); + } + } + + const removedKeys = [...signatures.keys()].filter((key) => !currentKeys.has(key)); + signatures = newSignatures; + + if (removedKeys.length > 0) { + module.remove_nodes(removedKeys); } - }); - const t3 = perfEnabled ? nowMs() : 0; - if (perfEnabled) { - // eslint-disable-next-line no-console - console.log( - `[layout-engine] nodes=${nodes.length} flattenTree=${(t1 - t0).toFixed(3)}ms wasm.compute_layout=${(t2 - t1).toFixed(3)}ms decode=${(t3 - t2).toFixed(3)}ms total=${(t3 - t0).toFixed(3)}ms`, - ); + if (changedNodes.length > 0) { + module.update_nodes(changedNodes); + } + + const rootKey = nodes[0].key; + const result = module.compute_layout(rootKey); + return normalizeComputedLayout(result); } - return computed; + return { + reset, + compute, + }; } -function flattenTree( - node: LayoutInputNode, - nodes: BridgeNode[], - elementMap: Map, -): number { - const index = nodes.length; - - const key = node.key ?? `node-${index}`; - elementMap.set(index, key); +function normalizeComputedLayout(value: unknown): ComputedLayout { + if (!value) return {}; + const maybeMap = value as { entries?: unknown; get?: unknown }; + const isMapLike = + value instanceof Map || + (typeof maybeMap === "object" && + maybeMap !== null && + typeof maybeMap.entries === "function" && + typeof maybeMap.get === "function"); + + if (isMapLike) { + const out: ComputedLayout = {}; + for (const [key, rect] of (value as Map).entries()) { + if (typeof key === "string") { + out[key] = rect as ComputedLayout[string]; + } + } + return out; + } + return value as ComputedLayout; +} - const bridgeNode: BridgeNode = { +function flattenBridgeNodes(node: LayoutInputNode, nodes: BridgeNodePayload[]): string { + const key = node.key ?? `node-${nodes.length}`; + const index = nodes.length; + nodes.push({ + key, style: extractStyle(node), children: [], measure: node.measuredSize, - }; - nodes.push(bridgeNode); + }); if (node.children && node.children.length > 0) { - const childIndices = node.children.map((child) => flattenTree(child, nodes, elementMap)); - nodes[index]!.children = childIndices; + const childKeys = node.children.map((child) => flattenBridgeNodes(child, nodes)); + nodes[index]!.children = childKeys; } - return index; + return key; +} + +function createSignature(node: BridgeNodePayload): string { + const styleJson = JSON.stringify(node.style); + const childrenKey = node.children.join(","); + const measureKey = node.measure ? `${node.measure.width}:${node.measure.height}` : ""; + return `${styleJson}|${childrenKey}|${measureKey}`; +} + +function getReadyModule(): LayoutEngineWasmModule { + if (!wasmInitialized) { + throw new Error("Layout engine not initialized. Call initLayoutEngine() first."); + } + if (!wasmModule) { + throw new Error("Layout engine module not loaded. Call initLayoutEngine() first."); + } + return wasmModule; } function extractStyle(node: LayoutInputNode): BridgeStyle { diff --git a/packages/layout-engine/src/lib.rs b/packages/layout-engine/src/lib.rs index 57f8c86..b879c88 100644 --- a/packages/layout-engine/src/lib.rs +++ b/packages/layout-engine/src/lib.rs @@ -1,12 +1,15 @@ use serde::{Deserialize, Serialize}; +use std::cell::RefCell; +use std::collections::{HashMap, HashSet, hash_map::Entry}; use taffy::prelude::*; use wasm_bindgen::prelude::*; #[derive(Deserialize)] -struct JsNode { +struct JsNodeUpdate { + key: String, style: JsStyle, - children: Vec, - measure: Option, + #[serde(default)] + children: Vec, } #[derive(Deserialize)] @@ -218,58 +221,135 @@ impl From<&JsStyle> for Style { } } -#[wasm_bindgen] -pub fn compute_layout(nodes_js: JsValue) -> Result { - let nodes: Vec = serde_wasm_bindgen::from_value(nodes_js)?; +struct LayoutEngineState { + taffy: TaffyTree>, + nodes: HashMap, +} - let mut taffy: TaffyTree> = TaffyTree::new(); - let mut node_ids = Vec::with_capacity(nodes.len()); +struct NodeInfo { + id: NodeId, +} - for node in &nodes { - let style: Style = (&node.style).into(); +impl LayoutEngineState { + fn new() -> Self { + Self { + taffy: TaffyTree::new(), + nodes: HashMap::new(), + } + } - let id = if let Some(size) = &node.measure { - // コンテキスト(固定サイズ)付きの葉ノードを作成 - let context = Size { - width: size.width, - height: size.height, - }; - taffy - .new_leaf_with_context(style, context) - .map_err(|e| e.to_string())? - } else { - taffy.new_leaf(style).map_err(|e| e.to_string())? - }; + fn update_nodes(&mut self, nodes: Vec) -> Result<(), String> { + for node in &nodes { + let style: Style = (&node.style).into(); + match self.nodes.entry(node.key.clone()) { + Entry::Occupied(entry) => { + self.taffy + .set_style(entry.get().id, style) + .map_err(|e| e.to_string())?; + } + Entry::Vacant(entry) => { + let id = self.taffy.new_leaf(style).map_err(|e| e.to_string())?; + entry.insert(NodeInfo { id }); + } + } + } + + for node in &nodes { + if let Some(info) = self.nodes.get(&node.key) { + let child_ids: Vec = node + .children + .iter() + .filter_map(|child_key| { + self.nodes.get(child_key).map(|child_info| child_info.id) + }) + .collect(); + self.taffy + .set_children(info.id, &child_ids) + .map_err(|e| e.to_string())?; + } + } - node_ids.push(id); + Ok(()) } - for (i, node) in nodes.iter().enumerate() { - if !node.children.is_empty() { - let parent = node_ids[i]; - let children: Vec = node.children.iter().map(|&idx| node_ids[idx]).collect(); - taffy - .set_children(parent, &children) - .map_err(|e| e.to_string())?; + fn remove_nodes(&mut self, keys: Vec) -> Result<(), String> { + let key_set: HashSet = keys.into_iter().collect(); + for key in &key_set { + if let Some(info) = self.nodes.remove(key) { + self.taffy.remove(info.id).map_err(|e| e.to_string())?; + } } + Ok(()) } - if let Some(&root_id) = node_ids.first() { - taffy - .compute_layout(root_id, Size::MAX_CONTENT) + fn compute_layout(&mut self, root_key: &str) -> Result, String> { + let root = self + .nodes + .get(root_key) + .ok_or_else(|| format!("root node not found: {}", root_key))?; + + self.taffy + .compute_layout(root.id, Size::MAX_CONTENT) .map_err(|e| e.to_string())?; - } - let mut outputs = Vec::with_capacity(nodes.len()); - for &id in &node_ids { - let layout = taffy.layout(id).map_err(|e| e.to_string())?; - outputs.push(LayoutOutput { - x: layout.location.x, - y: layout.location.y, - width: layout.size.width, - height: layout.size.height, - }); + let mut outputs = HashMap::with_capacity(self.nodes.len()); + for (key, info) in &self.nodes { + let layout = self.taffy.layout(info.id).map_err(|e| e.to_string())?; + outputs.insert( + key.clone(), + LayoutOutput { + x: layout.location.x, + y: layout.location.y, + width: layout.size.width, + height: layout.size.height, + }, + ); + } + + Ok(outputs) } +} + +thread_local! { + static ENGINE_STATE: RefCell> = RefCell::new(None); +} + +fn with_state( + f: impl FnOnce(&mut LayoutEngineState) -> Result, +) -> Result { + ENGINE_STATE.with(|cell| { + let mut guard = cell.borrow_mut(); + let state = guard + .as_mut() + .ok_or_else(|| JsValue::from_str("Layout engine not initialized"))?; + f(state).map_err(|e| JsValue::from_str(&e)) + }) +} + +#[wasm_bindgen] +pub fn init_layout_engine() -> Result<(), JsValue> { + ENGINE_STATE.with(|cell| { + let mut guard = cell.borrow_mut(); + *guard = Some(LayoutEngineState::new()); + Ok(()) + }) +} + +#[wasm_bindgen] +pub fn update_nodes(nodes_js: JsValue) -> Result<(), JsValue> { + let nodes: Vec = serde_wasm_bindgen::from_value(nodes_js)?; + with_state(|state| state.update_nodes(nodes)) +} - Ok(serde_wasm_bindgen::to_value(&outputs)?) +#[wasm_bindgen] +pub fn remove_nodes(keys_js: JsValue) -> Result<(), JsValue> { + let keys: Vec = serde_wasm_bindgen::from_value(keys_js)?; + with_state(|state| state.remove_nodes(keys)) +} + +#[wasm_bindgen] +pub fn compute_layout(root_key: &str) -> Result { + with_state(|state| state.compute_layout(root_key)).and_then(|outputs| { + serde_wasm_bindgen::to_value(&outputs).map_err(|e| JsValue::from_str(&e.to_string())) + }) } diff --git a/packages/renderer/src/buffer.ts b/packages/renderer/src/buffer.ts index fa96fdd..abb5113 100644 --- a/packages/renderer/src/buffer.ts +++ b/packages/renderer/src/buffer.ts @@ -20,6 +20,7 @@ export class FlatBuffer { readonly widths: Uint8Array; readonly fg: (string | undefined)[]; readonly bg: (string | undefined)[]; + private asciiOnly = true; constructor(rows: number, cols: number) { this.rows = rows; @@ -42,6 +43,7 @@ export class FlatBuffer { this.widths.fill(1); this.fg.fill(undefined); this.bg.fill(undefined); + this.asciiOnly = true; } /** @@ -82,6 +84,14 @@ export class FlatBuffer { return this.codes[idx] ?? 32; } + isAsciiOnly(): boolean { + return this.asciiOnly; + } + + copyAsciiStateFrom(other: FlatBuffer): void { + this.asciiOnly = other.asciiOnly; + } + /** * Set a cell's character and (optionally) styling at the given position. * Out-of-bounds writes are safely ignored. @@ -132,6 +142,9 @@ export class FlatBuffer { } this.clearFollowingContinuations(row, col); const normalized = glyph || " "; + const firstCode = normalized.codePointAt(0) ?? 0; + const glyphIsAscii = width === 1 && normalized.length === 1 && firstCode <= 0x7f; + this.asciiOnly = this.asciiOnly && glyphIsAscii; if ([...normalized].length > 1) { this.extras.set(idx, normalized); const first = normalized.codePointAt(0) ?? 32; diff --git a/packages/renderer/src/diff.ts b/packages/renderer/src/diff.ts index dacc229..5aa0792 100644 --- a/packages/renderer/src/diff.ts +++ b/packages/renderer/src/diff.ts @@ -46,6 +46,15 @@ export function renderDiff(prev: Buffer2D, next: Buffer2D, stats?: DiffStats): s stats.ops = 0; } + const asciiFastPath = prev.isAsciiOnly() && next.isAsciiOnly(); + if (asciiFastPath) { + const asciiOutput = renderDiffAscii(prev, next, rows, cols, sizeChanged, stats); + if (stats) { + stats.ops = stats.cursorMoves + stats.fgChanges + stats.bgChanges + stats.resets; + } + return asciiOutput; + } + let currentFg: string | undefined; let currentBg: string | undefined; let styleDirty = false; @@ -125,3 +134,82 @@ export function renderDiff(prev: Buffer2D, next: Buffer2D, stats?: DiffStats): s return out.length > 0 ? out.join("") : ""; } + +function renderDiffAscii( + prev: Buffer2D, + next: Buffer2D, + rows: number, + cols: number, + sizeChanged: boolean, + stats?: DiffStats, +): string { + const out: string[] = []; + let currentFg: string | undefined; + let currentBg: string | undefined; + let styleDirty = false; + + for (let r = 0; r < rows; r++) { + for (let c = 0; c < cols; c++) { + if (r === rows - 1 && c === cols - 1) { + continue; + } + + const idx = r * cols + c; + const nextWidth = next.widths[idx]; + if (nextWidth === 0) continue; + + const prevWidth = prev.widths[idx] ?? 0; + const prevCode = prev.codes[idx] ?? 32; + const nextCode = next.codes[idx] ?? 32; + const nextFg = next.fg[idx]; + const nextBg = next.bg[idx]; + const prevFg = prev.fg[idx]; + const prevBg = prev.bg[idx]; + + const needsDraw = + sizeChanged || + prevWidth !== nextWidth || + prevCode !== nextCode || + nextFg !== prevFg || + nextBg !== prevBg; + + if (!needsDraw) continue; + + if (stats) { + stats.changedCells++; + stats.cursorMoves++; + } + out.push(`\x1b[${r + 1};${c + 1}H`); + + if (nextFg !== currentFg) { + if (nextFg === undefined) { + out.push("\x1b[39m"); + } else { + out.push(nextFg); + } + currentFg = nextFg; + styleDirty = true; + if (stats) stats.fgChanges++; + } + if (nextBg !== currentBg) { + if (nextBg === undefined) { + out.push("\x1b[49m"); + } else { + out.push(nextBg); + } + currentBg = nextBg; + styleDirty = true; + if (stats) stats.bgChanges++; + } + + out.push(String.fromCharCode(nextCode)); + } + } + + if (styleDirty) { + out.push("\x1b[0m"); + if (stats) stats.resets++; + } + + return out.length > 0 ? out.join("") : ""; +} diff --git a/packages/renderer/src/grid.ts b/packages/renderer/src/grid.ts index f74b1a0..a72fa87 100644 --- a/packages/renderer/src/grid.ts +++ b/packages/renderer/src/grid.ts @@ -49,6 +49,7 @@ export function cloneBuffer(buf: Buffer2D): Buffer2D { copy.fg[i] = buf.fg[i]; copy.bg[i] = buf.bg[i]; } + copy.copyAsciiStateFrom(buf); return copy; } diff --git a/packages/showcase/counter.ts b/packages/showcase/counter.ts index 473ddab..094a924 100644 --- a/packages/showcase/counter.ts +++ b/packages/showcase/counter.ts @@ -34,3 +34,8 @@ const app = createApp({ }); await app.mount(); + +const exitAfterMs = Number(process.env.BTUIN_EXIT_AFTER_MS ?? ""); +if (Number.isFinite(exitAfterMs) && exitAfterMs > 0) { + setTimeout(() => process.exit(0), exitAfterMs); +} diff --git a/packages/showcase/dashboard.ts b/packages/showcase/dashboard.ts index 03f219b..ed5ae90 100644 --- a/packages/showcase/dashboard.ts +++ b/packages/showcase/dashboard.ts @@ -251,3 +251,8 @@ const app = createApp({ }); await app.mount(); + +const exitAfterMs = Number(process.env.BTUIN_EXIT_AFTER_MS ?? ""); +if (Number.isFinite(exitAfterMs) && exitAfterMs > 0) { + setTimeout(() => process.exit(0), exitAfterMs); +} diff --git a/packages/showcase/package.json b/packages/showcase/package.json index 93539b3..fe8111b 100644 --- a/packages/showcase/package.json +++ b/packages/showcase/package.json @@ -2,5 +2,9 @@ "name": "showcase", "dependencies": { "btuin": "workspace:*" + }, + "scripts": { + "counter": "BTUIN_EXIT_AFTER_MS=0 bun run counter.ts", + "dashboard": "BTUIN_EXIT_AFTER_MS=0 bun run dashboard.ts" } } diff --git a/packages/showcase/tests/showcase-smoke.test.ts b/packages/showcase/tests/showcase-smoke.test.ts new file mode 100644 index 0000000..43b2617 --- /dev/null +++ b/packages/showcase/tests/showcase-smoke.test.ts @@ -0,0 +1,51 @@ +import { describe, it, expect } from "bun:test"; +function stripCsi(input: string): string { + // Strip CSI sequences like: ESC[12;34H, ESC[31m, etc. + return input.replace(/\x1b\[[0-9;]*[A-Za-z]/g, ""); +} + +describe("showcase smoke", () => { + it("counter renders at least once", async () => { + const proc = Bun.spawn(["bun", "run", "packages/showcase/counter.ts"], { + stdout: "pipe", + stderr: "pipe", + env: { + ...process.env, + BTUIN_EXIT_AFTER_MS: "50", + }, + }); + + const [exitCode, stdout, stderr] = await Promise.all([ + proc.exited, + new Response(proc.stdout).text(), + new Response(proc.stderr).text(), + ]); + + expect(exitCode).toBe(0); + expect(stderr).toBe(""); + expect(stripCsi(stdout)).toContain("Counter"); + }); + + it("dashboard renders at least once", async () => { + const proc = Bun.spawn(["bun", "run", "packages/showcase/dashboard.ts"], { + stdout: "pipe", + stderr: "pipe", + env: { + ...process.env, + BTUIN_EXIT_AFTER_MS: "75", + }, + }); + + const [exitCode, stdout, stderr] = await Promise.all([ + proc.exited, + new Response(proc.stdout).text(), + new Response(proc.stderr).text(), + ]); + + expect(exitCode).toBe(0); + expect(stderr).toBe(""); + const text = stripCsi(stdout); + expect(text).toContain("btuin"); + expect(text).toContain("showcase"); + }); +}); diff --git a/scripts/profiler-core.ts b/scripts/profiler-core.ts index 0cfce2e..adeb728 100644 --- a/scripts/profiler-core.ts +++ b/scripts/profiler-core.ts @@ -128,9 +128,7 @@ export function printSummary(log: ProfilerLog) { const renderPeaks = summarizeFrames(frames, "renderMs", 3); console.log(" render bottlenecks:"); - renderPeaks.forEach((frame) => - console.log(` - ${describeFrame(frame)} (render-heavy)`), - ); + renderPeaks.forEach((frame) => console.log(` - ${describeFrame(frame)} (render-heavy)`)); const layoutPeak = summarizeFrames(frames, "layoutMs", 1)[0]; if (layoutPeak) { @@ -154,7 +152,11 @@ export function printSummary(log: ProfilerLog) { } console.log(" takeaways:"); - console.log(" - Render is responsible for the biggest time slices; look into partial rendering or memoization."); - console.log(" - Layout, diff, and write stay low, so efforts should focus on taming render-heavy spikes."); + console.log( + " - Render is responsible for the biggest time slices; look into partial rendering or memoization.", + ); + console.log( + " - Layout, diff, and write stay low, so efforts should focus on taming render-heavy spikes.", + ); console.log("-".repeat(60)); } diff --git a/scripts/profiler-layout.spec.ts b/scripts/profiler-layout.spec.ts index c70dd2c..8e35ddf 100644 --- a/scripts/profiler-layout.spec.ts +++ b/scripts/profiler-layout.spec.ts @@ -85,26 +85,18 @@ const app = createApp({ }, }); -describe("Layout Change Stress Test", () => { - test( - "should run without errors", - async () => { - const appInstance = await app.mount(); - expect(appInstance.getComponent()).not.toBeNull(); - await finished; - appInstance.unmount(); - expect(existsSync(out)).toBe(true); - }, - { timeout: 60_000 }, - ); - - test("Performance Requirements", async () => { - const log = await import(`../${out}`, { with: { type: "json" } }) as ProfilerLog - printSummary(log); - expect(log.summary.totals.frameMs / log.summary.frameCount).toBeLessThan(33.4) - expect(log.summary.frameMs.max).toBeLessThan(50) - expect(log.summary.frameMs.p99).toBeGreaterThan(33.4) - expect(log.summary.frameMs.p95).toBeLessThan(30) - expect(log.summary.frameMs.p50).toBeLessThan(25) - }); +describe("Layout Change Stress Test", async () => { + const appInstance = await app.mount(); + expect(appInstance.getComponent()).not.toBeNull(); + await finished; + appInstance.unmount(); + expect(existsSync(out)).toBe(true); + const log = (await import(`../${out}`, { with: { type: "json" } })) as ProfilerLog; + printSummary(log); + test("Average Frame Time: < 33.4", () => + expect(log.summary.totals.frameMs / log.summary.frameCount).toBeLessThan(33.4)); + test("frameMs Max < 60", () => expect(log.summary.frameMs.max).toBeLessThan(60)); + test("framMs P99 < 33.4", () => expect(log.summary.frameMs.p99).toBeLessThan(33.4)); + test("frameMs P95 < 30", () => expect(log.summary.frameMs.p95).toBeLessThan(30)); + test("frameMs P50 < 25", () => expect(log.summary.frameMs.p50).toBeLessThan(25)); }); diff --git a/scripts/profiler-stress.spec.ts b/scripts/profiler-stress.spec.ts index d980b89..35eea06 100644 --- a/scripts/profiler-stress.spec.ts +++ b/scripts/profiler-stress.spec.ts @@ -51,25 +51,18 @@ const app = createApp({ }); describe("Profiler Stress Test", async () => { - test( - "should run without errors", - async () => { - const appInstance = await app.mount(); - expect(appInstance.getComponent()).not.toBeNull(); - await finished; - appInstance.unmount(); - expect(existsSync(out)).toBe(true); - }, - { timeout: 45_000 }, - ); - - test("Performance Requirements", async () => { - const log = await import(`../${out}`, { with: { type: "json" } }) as ProfilerLog - printSummary(log); - expect(log.summary.totals.frameMs / log.summary.frameCount).toBeLessThan(16.7) - expect(log.summary.frameMs.max).toBeLessThan(50) - expect(log.summary.frameMs.p99).toBeGreaterThan(0.2) - expect(log.summary.frameMs.p95).toBeLessThan(0.5) - expect(log.summary.frameMs.p50).toBeLessThan(1) - }); + const appInstance = await app.mount(); + expect(appInstance.getComponent()).not.toBeNull(); + await finished; + appInstance.unmount(); + expect(existsSync(out)).toBe(true); + const log = (await import(`../${out}`, { with: { type: "json" } })) as ProfilerLog; + printSummary(log); + expect(log.summary.totals.frameMs / log.summary.frameCount).toBeLessThan(16.7); + test("Average Frame Time < 33.4", () => + expect(log.summary.totals.frameMs / log.summary.frameCount).toBeLessThan(33.4)); + test("frameMs Max < 60", () => expect(log.summary.frameMs.max).toBeLessThan(60)); + test("framMs P99 < 20", () => expect(log.summary.frameMs.p99).toBeLessThan(20)); + test("frameMs P95 < 10", () => expect(log.summary.frameMs.p95).toBeLessThan(10)); + test("frameMs P50 < 5", () => expect(log.summary.frameMs.p50).toBeLessThan(5)); }); From b3a888e828de8c8064bcbc38031c956b1ee13167 Mon Sep 17 00:00:00 2001 From: HAL <68320771+HALQME@users.noreply.github.com> Date: Mon, 15 Dec 2025 11:08:54 +0900 Subject: [PATCH 04/12] Add layout boundary support Introduce layoutBoundary flag to LayoutStyle and a Block.boundary() helper. Implement applyLayoutBoundaryToBlock and estimateChildLength to trim block children when a block has layoutBoundary set. Add LayoutBoundary factory and tests for trimming behavior. --- packages/btuin/src/layout/index.ts | 66 ++++++++++++++++++++- packages/btuin/src/view/layout.ts | 4 ++ packages/btuin/src/view/primitives/block.ts | 5 ++ packages/btuin/tests/layout/index.test.ts | 22 +++++++ packages/layout-engine/src/index.ts | 1 + 5 files changed, 95 insertions(+), 3 deletions(-) diff --git a/packages/btuin/src/layout/index.ts b/packages/btuin/src/layout/index.ts index 38f9491..b056480 100644 --- a/packages/btuin/src/layout/index.ts +++ b/packages/btuin/src/layout/index.ts @@ -5,7 +5,7 @@ import { type ComputedLayout, type Dimension, } from "@btuin/layout-engine"; -import { isBlock, isText, type ViewElement } from "../view/types/elements"; +import { isBlock, isText, type ViewElement, type BlockView } from "../view/types/elements"; export { renderElement } from "./renderer"; @@ -68,6 +68,65 @@ function resolveDimension(dim: unknown, base: number): Dimension | undefined { return percentToNumber(dim, base); } +function estimateChildLength( + child: ViewElement, + direction: "row" | "column" | "row-reverse" | "column-reverse", + parentSize?: LayoutContainerSize, +): number { + const style = child.style ?? {}; + const base = direction === "column" || direction === "column-reverse" ? parentSize?.height ?? 0 : parentSize?.width ?? 0; + const dimension = direction === "column" || direction === "column-reverse" ? style.height : style.width; + const resolved = resolveDimension(dimension, base); + if (typeof resolved === "number") { + return Math.max(0, resolved); + } + const minDimension = direction === "column" || direction === "column-reverse" ? style.minHeight : style.minWidth; + const resolvedMin = resolveDimension(minDimension, base); + if (typeof resolvedMin === "number") { + return Math.max(0, resolvedMin); + } + if (isText(child)) { + return direction === "column" || direction === "column-reverse" ? 1 : child.content.length; + } + return 1; +} + +function applyLayoutBoundaryToBlock( + block: BlockView, + children: ViewElement[], + contentSize?: LayoutContainerSize, + stack?: string, +): ViewElement[] { + if (!block.style?.layoutBoundary || stack === "z" || !contentSize) { + return children; + } + const direction = block.style.flexDirection ?? "column"; + const limit = direction === "column" ? contentSize.height : contentSize.width; + if (typeof limit !== "number" || limit <= 0) { + return children; + } + + const filtered: ViewElement[] = []; + let consumed = 0; + + for (const child of children) { + const childLength = estimateChildLength(child, direction, contentSize); + if (childLength > limit) { + break; + } + if (consumed + childLength > limit) { + break; + } + consumed += childLength; + filtered.push(child); + if (consumed >= limit) { + break; + } + } + + return filtered; +} + function viewElementToLayoutNode( element: ViewElement, parentSize?: LayoutContainerSize, @@ -113,9 +172,10 @@ function viewElementToLayoutNode( : parentSize; const stack = element.style?.stack; + const childrenForLayout = applyLayoutBoundaryToBlock(element, element.children, contentSize, stack); if (stack === "z") { if (node.position === undefined) node.position = "relative"; - node.children = element.children.map((child) => { + node.children = childrenForLayout.map((child) => { const childNode = viewElementToLayoutNode(child, contentSize); if (childNode.position === undefined) childNode.position = "absolute"; if (childNode.type === "block") { @@ -129,7 +189,7 @@ function viewElementToLayoutNode( return childNode; }); } else { - node.children = element.children.map((child) => viewElementToLayoutNode(child, contentSize)); + node.children = childrenForLayout.map((child) => viewElementToLayoutNode(child, contentSize)); } } else if (isText(element)) { const textWidth = element.content.length; diff --git a/packages/btuin/src/view/layout.ts b/packages/btuin/src/view/layout.ts index 90802bf..1c7bc9f 100644 --- a/packages/btuin/src/view/layout.ts +++ b/packages/btuin/src/view/layout.ts @@ -20,3 +20,7 @@ export function ZStack(children: ViewElement[] = []): BlockElement { el.style.stack = "z"; return el; } + +export function LayoutBoundary(children: ViewElement[] = []): BlockElement { + return Block(...children).boundary(); +} diff --git a/packages/btuin/src/view/primitives/block.ts b/packages/btuin/src/view/primitives/block.ts index 02d7381..985f079 100644 --- a/packages/btuin/src/view/primitives/block.ts +++ b/packages/btuin/src/view/primitives/block.ts @@ -32,6 +32,11 @@ export class BlockElement extends BaseView implements BlockView { this.style.alignItems = value; return this; } + + boundary(): this { + this.style.layoutBoundary = true; + return this; + } } // ファクトリ関数 diff --git a/packages/btuin/tests/layout/index.test.ts b/packages/btuin/tests/layout/index.test.ts index 1cc0683..1daad28 100644 --- a/packages/btuin/tests/layout/index.test.ts +++ b/packages/btuin/tests/layout/index.test.ts @@ -1,6 +1,7 @@ import { describe, it, expect } from "bun:test"; import { createLayout } from "../../src/layout"; import { Block, Text } from "../../src/view/primitives"; +import { LayoutBoundary } from "../../src/view/layout"; import type { LayoutInputNode, ComputedLayout } from "@btuin/layout-engine"; // Mock the layout engine @@ -95,4 +96,25 @@ describe("layout", () => { expect(childNode?.width).toBe(40); expect(childNode?.height).toBe(10); }); + + it("should trim children that exceed the layout boundary", () => { + receivedLayoutNode = null; + const { layout } = createLayout({ + initLayoutEngine: async () => {}, + computeLayout: (node: LayoutInputNode): ComputedLayout => { + receivedLayoutNode = node; + expect(receivedLayoutNode?.children?.length).toBe(2); + return mockComputedLayout; + }, + }); + + const root = LayoutBoundary([ + Text({ value: "one" }), + Text({ value: "two" }), + Text({ value: "three" }), + ]).height(2); + + layout(root, { width: 10, height: 2 }); + + }); }); diff --git a/packages/layout-engine/src/index.ts b/packages/layout-engine/src/index.ts index 81562f0..e46766d 100644 --- a/packages/layout-engine/src/index.ts +++ b/packages/layout-engine/src/index.ts @@ -69,6 +69,7 @@ export interface LayoutStyle { minHeight?: Dimension; maxWidth?: Dimension; maxHeight?: Dimension; + layoutBoundary?: boolean; padding?: number | [number, number, number, number]; margin?: number | [number, number, number, number]; From 71429c1dede6f9623c1d6f0e0d4717e3a38d2bc2 Mon Sep 17 00:00:00 2001 From: HAL <68320771+HALQME@users.noreply.github.com> Date: Mon, 15 Dec 2025 12:59:24 +0900 Subject: [PATCH 05/12] Add Profiler Limit Test and Improve Profiling Add scripts/profiler-limit.spec.ts and a "profiler:limit" npm script. Introduce WARMUP_FRAMES in profiler-core.ts. Update profiler specs to assert startup latency and steady-state metrics and call Bun.gc(true) before runs. Add clipping early-return to renderElement to skip offscreen rendering. Apply minor formatting and whitespace cleanup in layout and tests. --- package.json | 1 + packages/btuin/src/layout/index.ts | 18 ++- packages/btuin/src/layout/renderer.ts | 10 ++ packages/btuin/tests/layout/index.test.ts | 1 - scripts/profiler-core.ts | 2 + scripts/profiler-layout.spec.ts | 28 +++- scripts/profiler-limit.spec.ts | 153 ++++++++++++++++++++++ scripts/profiler-stress.spec.ts | 29 ++-- 8 files changed, 222 insertions(+), 20 deletions(-) create mode 100644 scripts/profiler-limit.spec.ts diff --git a/package.json b/package.json index 3c7ef20..be84230 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "profiler": "bun test scripts/profiler*.spec.ts", "profiler:stress": "bun test scripts/profiler-stress.test.ts", "profiler:layout": "bun test scripts/profiler-layout.test.ts", + "profiler:limit": "bun test scripts/profiler-limit.spec.ts", "check": "bunx tsc --noEmit" }, "devDependencies": { diff --git a/packages/btuin/src/layout/index.ts b/packages/btuin/src/layout/index.ts index b056480..964b5d0 100644 --- a/packages/btuin/src/layout/index.ts +++ b/packages/btuin/src/layout/index.ts @@ -74,13 +74,18 @@ function estimateChildLength( parentSize?: LayoutContainerSize, ): number { const style = child.style ?? {}; - const base = direction === "column" || direction === "column-reverse" ? parentSize?.height ?? 0 : parentSize?.width ?? 0; - const dimension = direction === "column" || direction === "column-reverse" ? style.height : style.width; + const base = + direction === "column" || direction === "column-reverse" + ? (parentSize?.height ?? 0) + : (parentSize?.width ?? 0); + const dimension = + direction === "column" || direction === "column-reverse" ? style.height : style.width; const resolved = resolveDimension(dimension, base); if (typeof resolved === "number") { return Math.max(0, resolved); } - const minDimension = direction === "column" || direction === "column-reverse" ? style.minHeight : style.minWidth; + const minDimension = + direction === "column" || direction === "column-reverse" ? style.minHeight : style.minWidth; const resolvedMin = resolveDimension(minDimension, base); if (typeof resolvedMin === "number") { return Math.max(0, resolvedMin); @@ -172,7 +177,12 @@ function viewElementToLayoutNode( : parentSize; const stack = element.style?.stack; - const childrenForLayout = applyLayoutBoundaryToBlock(element, element.children, contentSize, stack); + const childrenForLayout = applyLayoutBoundaryToBlock( + element, + element.children, + contentSize, + stack, + ); if (stack === "z") { if (node.position === undefined) node.position = "relative"; node.children = childrenForLayout.map((child) => { diff --git a/packages/btuin/src/layout/renderer.ts b/packages/btuin/src/layout/renderer.ts index 63d8806..c6e1ac8 100644 --- a/packages/btuin/src/layout/renderer.ts +++ b/packages/btuin/src/layout/renderer.ts @@ -21,6 +21,16 @@ export function renderElement( const absX = layout.x + _parentX; const absY = layout.y + _parentY; const { width, height } = layout; + const MARGIN = 5; + + if ( + absY >= buffer.rows + MARGIN || + absX >= buffer.cols + MARGIN || + absY + height <= -MARGIN || + absX + width <= -MARGIN + ) { + return; + } const bg = element.style?.background; if (bg !== undefined) { diff --git a/packages/btuin/tests/layout/index.test.ts b/packages/btuin/tests/layout/index.test.ts index 1daad28..2b86edf 100644 --- a/packages/btuin/tests/layout/index.test.ts +++ b/packages/btuin/tests/layout/index.test.ts @@ -115,6 +115,5 @@ describe("layout", () => { ]).height(2); layout(root, { width: 10, height: 2 }); - }); }); diff --git a/scripts/profiler-core.ts b/scripts/profiler-core.ts index adeb728..dcae0bf 100644 --- a/scripts/profiler-core.ts +++ b/scripts/profiler-core.ts @@ -1,5 +1,7 @@ import type { TerminalAdapter } from "../packages/btuin/src/runtime"; +const WARMUP_FRAMES = 5; + type FrameMetrics = { id: number; time: number; diff --git a/scripts/profiler-layout.spec.ts b/scripts/profiler-layout.spec.ts index 8e35ddf..ccb11e7 100644 --- a/scripts/profiler-layout.spec.ts +++ b/scripts/profiler-layout.spec.ts @@ -85,7 +85,8 @@ const app = createApp({ }, }); -describe("Layout Change Stress Test", async () => { +describe("Many Layout Change Test", async () => { + Bun.gc(true) const appInstance = await app.mount(); expect(appInstance.getComponent()).not.toBeNull(); await finished; @@ -93,10 +94,23 @@ describe("Layout Change Stress Test", async () => { expect(existsSync(out)).toBe(true); const log = (await import(`../${out}`, { with: { type: "json" } })) as ProfilerLog; printSummary(log); - test("Average Frame Time: < 33.4", () => - expect(log.summary.totals.frameMs / log.summary.frameCount).toBeLessThan(33.4)); - test("frameMs Max < 60", () => expect(log.summary.frameMs.max).toBeLessThan(60)); - test("framMs P99 < 33.4", () => expect(log.summary.frameMs.p99).toBeLessThan(33.4)); - test("frameMs P95 < 30", () => expect(log.summary.frameMs.p95).toBeLessThan(30)); - test("frameMs P50 < 25", () => expect(log.summary.frameMs.p50).toBeLessThan(25)); + + const frames = log.frames; + const firstFrame = frames[0]; + const steadyFrames = frames.slice(5); + + test("Startup Latency (Frame 1) < 100ms", () => { + expect(firstFrame).toBeDefined() + expect(firstFrame!.frameMs).toBeLessThan(100); + }); + + test("Steady State Max (Frame 5+) < 33.4ms (30 FPS)", () => { + const maxSteady = Math.max(...steadyFrames.map((f) => f.frameMs)); + expect(maxSteady).toBeLessThan(33.4); + }); + + test("Steady State Average < 30ms", () => { + const avgSteady = steadyFrames.reduce((sum, f) => sum + f.frameMs, 0) / steadyFrames.length; + expect(avgSteady).toBeLessThan(30); + }); }); diff --git a/scripts/profiler-limit.spec.ts b/scripts/profiler-limit.spec.ts new file mode 100644 index 0000000..2b787b0 --- /dev/null +++ b/scripts/profiler-limit.spec.ts @@ -0,0 +1,153 @@ +import { describe, expect, test } from "bun:test"; +import { existsSync } from "node:fs"; +import { Block, Text, createApp, ref } from "../packages/btuin"; +import { createNullTerminalAdapter, type ProfilerLog } from "./profiler-core"; + +// ---------------------------------------------------------------------------- +// Configuration +// ---------------------------------------------------------------------------- +const FRAMES = 300; // Total frames per run +const START_NODES = 0; // Initial nodes +const STEP_NODES = 100; // Nodes added per frame +const INTERVAL_MS = 2; // Update interval +const ITERATIONS = 5; // Number of times to repeat the test + +const OUTPUT_FILE = `profiles/limit-${Date.now()}.json`; + +async function runSingleIteration(iterationIndex: number): Promise { + const tick = ref(0); + let resolveFinished: (() => void) | null = null; + const finished = new Promise((resolve) => { + resolveFinished = resolve; + }); + + const app = createApp({ + setup() { + let produced = 0; + const timer = setInterval(() => { + tick.value++; + produced++; + if (produced >= FRAMES) { + clearInterval(timer); + resolveFinished?.(); + } + }, INTERVAL_MS); + + return () => { + const count = START_NODES + tick.value * STEP_NODES; + const root = Block().direction("column"); + + const children = new Array(count); + for (let i = 0; i < count; i++) { + children[i] = Text(`item ${i}`).foreground(i % 2 === 0 ? "white" : "gray"); + } + root.children = children; + + root.children.unshift( + Text(`Iter: ${iterationIndex} Frame: ${tick.value} | Nodes: ${count}`).foreground("cyan"), + ); + return root; + }; + }, + terminal: createNullTerminalAdapter({ rows: 40, cols: 120 }), + profile: { + enabled: true, + outputFile: OUTPUT_FILE, + maxFrames: FRAMES, + nodeCount: true, + }, + }); + + const appInstance = await app.mount(); + await finished; + appInstance.unmount(); + + if (!existsSync(OUTPUT_FILE)) { + throw new Error(`Profile output file not found: ${OUTPUT_FILE}`); + } + + const fileContent = await Bun.file(OUTPUT_FILE).text(); + return JSON.parse(fileContent) as ProfilerLog; +} + +function calculateStats(values: number[]) { + if (values.length === 0) return { avg: 0, min: 0, max: 0, stdDev: 0 }; + + const sum = values.reduce((a, b) => a + b, 0); + const avg = sum / values.length; + const min = Math.min(...values); + const max = Math.max(...values); + + const squaredDiffs = values.map(v => Math.pow(v - avg, 2)); + const avgSquaredDiff = squaredDiffs.reduce((a, b) => a + b, 0) / values.length; + const stdDev = Math.sqrt(avgSquaredDiff); + + return { avg, min, max, stdDev }; +} + +describe("Scalability Limit Test (Statistical)", async () => { + console.log(`\nStarting Statistical Stress Test (${ITERATIONS} iterations)`); + + const thresholds = [ + { fps: 120, ms: 8.33 }, + { fps: 60, ms: 16.66 }, + { fps: 30, ms: 33.33 }, + { fps: 15, ms: 66.66 }, + ]; + + const results: Record = {}; + thresholds.forEach(t => results[t.fps] = []); + + for (let i = 0; i < ITERATIONS; i++) { + Bun.stdout.write(` Run ${i + 1}/${ITERATIONS}... `); + + Bun.gc(true) + + const log = await runSingleIteration(i); + + const smoothedFrames = log.frames.map((frame, idx, all) => { + const start = Math.max(0, idx - 2); + const end = Math.min(all.length, idx + 3); + const subset = all.slice(start, end); + const avgMs = subset.reduce((sum, f) => sum + f.frameMs, 0) / subset.length; + return { ...frame, avgMs, nodeCount: START_NODES + idx * STEP_NODES }; + }); + + const validFrames = smoothedFrames.slice(5); + + for (const t of thresholds) { + expect(results[t.fps]).toBeDefined() + const limitFrame = validFrames.find((f) => f.avgMs > t.ms); + const limitNodeCount = limitFrame ? limitFrame.nodeCount : (START_NODES + FRAMES * STEP_NODES); + + results[t.fps]!.push(limitNodeCount); + } + console.log(`Done.`); + } + + console.log("\n" + "=".repeat(52)); + console.log(` Performance Limits Report ${ITERATIONS} runs`); + console.log("=".repeat(52)); + console.log(`| FPS Target | Avg Nodes | Min | Max | Std Dev |`); + console.log(`|${"-".repeat(12)}|${"-".repeat(11)}|${"-".repeat(7)}|${"-".repeat(7)}|${"-".repeat(9)}|`); + + for (const t of thresholds) { + expect(results[t.fps]).toBeDefined() + const stats = calculateStats(results[t.fps]!); + // If stats.avg is the max possible nodes, it implies we never hit the limit + const note = stats.avg >= (START_NODES + FRAMES * STEP_NODES) ? "+" : ""; + + console.log( + `| ${t.fps.toString().padStart(3)} FPS | ` + + `${(Math.round(stats.avg) + note).toString().padEnd(9)} | ` + + `${Math.round(stats.min).toString().padEnd(5)} | ` + + `${Math.round(stats.max).toString().padEnd(5)} | ` + + `±${Math.round(stats.stdDev).toString().padEnd(6)} |` + ); + } + console.log("=".repeat(52)); + + test("Stress test finished successfully", () => { + expect(true).toBe(true); + }); +}); diff --git a/scripts/profiler-stress.spec.ts b/scripts/profiler-stress.spec.ts index 35eea06..72ccecc 100644 --- a/scripts/profiler-stress.spec.ts +++ b/scripts/profiler-stress.spec.ts @@ -50,7 +50,8 @@ const app = createApp({ }, }); -describe("Profiler Stress Test", async () => { +describe("Multi Element Stress Test", async () => { + Bun.gc(true) const appInstance = await app.mount(); expect(appInstance.getComponent()).not.toBeNull(); await finished; @@ -58,11 +59,23 @@ describe("Profiler Stress Test", async () => { expect(existsSync(out)).toBe(true); const log = (await import(`../${out}`, { with: { type: "json" } })) as ProfilerLog; printSummary(log); - expect(log.summary.totals.frameMs / log.summary.frameCount).toBeLessThan(16.7); - test("Average Frame Time < 33.4", () => - expect(log.summary.totals.frameMs / log.summary.frameCount).toBeLessThan(33.4)); - test("frameMs Max < 60", () => expect(log.summary.frameMs.max).toBeLessThan(60)); - test("framMs P99 < 20", () => expect(log.summary.frameMs.p99).toBeLessThan(20)); - test("frameMs P95 < 10", () => expect(log.summary.frameMs.p95).toBeLessThan(10)); - test("frameMs P50 < 5", () => expect(log.summary.frameMs.p50).toBeLessThan(5)); + + const frames = log.frames; + const firstFrame = frames[0]; + const steadyFrames = frames.slice(5); + + test("Startup Latency (Frame 1) < 100ms", () => { + expect(firstFrame).toBeDefined() + expect(firstFrame!.frameMs).toBeLessThan(100); + }); + + test("Steady State Max (Frame 5+) < 16.7ms (60 FPS)", () => { + const maxSteady = Math.max(...steadyFrames.map((f) => f.frameMs)); + expect(maxSteady).toBeLessThan(16.7); + }); + + test("Steady State Average < 10ms", () => { + const avgSteady = steadyFrames.reduce((sum, f) => sum + f.frameMs, 0) / steadyFrames.length; + expect(avgSteady).toBeLessThan(10); + }); }); From 531a42acb0e6758959d176a50ab60a0b4a29fa00 Mon Sep 17 00:00:00 2001 From: HAL <68320771+HALQME@users.noreply.github.com> Date: Mon, 15 Dec 2025 13:14:00 +0900 Subject: [PATCH 06/12] Add CI, build, and benchmark GitHub workflows --- .github/workflows/build.yml | 29 ++++++++++ .github/workflows/ci.yml | 53 +++++++++++++++++++ .github/workflows/profiler.yml | 96 ++++++++++++++++++++++++++++++++++ 3 files changed, 178 insertions(+) create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/profiler.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..3e357a4 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,29 @@ +name: Build & Release + +on: + push: + branches: ["main"] + +jobs: + build: + name: Build Packages + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Setup Bun + uses: oven-sh/setup-bun@v1 + with: + bun-version: latest + + - name: Setup pnpm + uses: pnpm/action-setup@v2 + with: + run_install: false + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Build + run: pnpm run build diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..c749db8 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,53 @@ +name: CI + +on: + push: + branches: ["main"] + pull_request: + branches: ["**"] + +jobs: + check: + name: Lint, Type Check & Test + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Setup Bun + uses: oven-sh/setup-bun@v1 + with: + bun-version: latest + + - name: Setup pnpm + uses: pnpm/action-setup@v2 + with: + run_install: false + + - name: Get pnpm store directory + shell: bash + run: | + echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV + + - uses: actions/cache@v3 + name: Setup pnpm cache + with: + path: ${{ env.STORE_PATH }} + key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm-store- + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Check Formatting + run: pnpm run format --check + + - name: Lint + run: pnpm run lint + + - name: Type Check + run: pnpm run check + + - name: Run Tests + run: pnpm run test diff --git a/.github/workflows/profiler.yml b/.github/workflows/profiler.yml new file mode 100644 index 0000000..a23a5ef --- /dev/null +++ b/.github/workflows/profiler.yml @@ -0,0 +1,96 @@ +name: Performance Benchmark + +on: + pull_request: + branches: ["**"] + paths-ignore: + - "**.md" + - "docs/**" + workflow_dispatch: + +jobs: + benchmark: + name: Run Benchmark + runs-on: ubuntu-latest + permissions: + contents: read + pull-requests: write + + steps: + - uses: actions/checkout@v4 + + - name: Setup Bun + uses: oven-sh/setup-bun@v1 + with: + bun-version: latest + + - name: Setup pnpm + uses: pnpm/action-setup@v2 + with: + version: 8 + run_install: false + + - name: Get pnpm store directory + shell: bash + run: | + echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV + + - uses: actions/cache@v3 + name: Setup pnpm cache + with: + path: ${{ env.STORE_PATH }} + key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm-store- + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Run Limit Test + run: | + pnpm run profiler:limit | tee benchmark_result.txt + + - name: Extract Report + id: extract_report + run: | + REPORT=$(sed -n '/Performance Limits Report/,$p' benchmark_result.txt) + + echo "REPORT_CONTENT<> $GITHUB_ENV + echo "$REPORT" >> $GITHUB_ENV + echo "EOF" >> $GITHUB_ENV + + - name: Comment Benchmark Result + if: github.event_name == 'pull_request' + uses: actions/github-script@v6 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const report = process.env.REPORT_CONTENT; + + const { data: comments } = await github.rest.issues.listComments({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + }); + + const botComment = comments.find(comment => { + return comment.user.type === 'Bot' && comment.body.includes('Performance Limits Report'); + }); + + const body = `### 🚀 Performance Benchmark Result\n\n\`\`\`text\n${report}\n\`\`\`\n\n
Run Details\nTriggered by commit: ${context.sha}
`; + + if (botComment) { + await github.rest.issues.updateComment({ + owner: context.repo.owner, + repo: context.repo.repo, + comment_id: botComment.id, + body: body + }); + } else { + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + body: body + }); + } From cd8fa9512ed1ec7e4ec6fc958644cda7a10e1642 Mon Sep 17 00:00:00 2001 From: HAL <68320771+HALQME@users.noreply.github.com> Date: Mon, 15 Dec 2025 13:32:30 +0900 Subject: [PATCH 07/12] Setup Rust and wasm-pack; build WASM in CI Add Rust toolchain and wasm-pack setup to CI and profiler workflows, and add a pnpm step to build @btuin/layout-engine (WASM). Remove the explicit pnpm version pin from the profiler workflow. --- .github/workflows/ci.yml | 11 +++++++++++ .github/workflows/profiler.yml | 12 +++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c749db8..0e9bf74 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,6 +14,14 @@ jobs: steps: - uses: actions/checkout@v4 + - name: Setup Rust + uses: dtolnay/rust-toolchain@stable + + - name: Install wasm-pack + uses: jetli/wasm-pack-action@v4 + with: + version: "latest" + - name: Setup Bun uses: oven-sh/setup-bun@v1 with: @@ -40,6 +48,9 @@ jobs: - name: Install dependencies run: pnpm install --frozen-lockfile + - name: Build Layout Engine (WASM) + run: pnpm --filter @btuin/layout-engine build + - name: Check Formatting run: pnpm run format --check diff --git a/.github/workflows/profiler.yml b/.github/workflows/profiler.yml index a23a5ef..3da3fbf 100644 --- a/.github/workflows/profiler.yml +++ b/.github/workflows/profiler.yml @@ -19,6 +19,14 @@ jobs: steps: - uses: actions/checkout@v4 + - name: Setup Rust + uses: dtolnay/rust-toolchain@stable + + - name: Install wasm-pack + uses: jetli/wasm-pack-action@v4 + with: + version: "latest" + - name: Setup Bun uses: oven-sh/setup-bun@v1 with: @@ -27,7 +35,6 @@ jobs: - name: Setup pnpm uses: pnpm/action-setup@v2 with: - version: 8 run_install: false - name: Get pnpm store directory @@ -46,6 +53,9 @@ jobs: - name: Install dependencies run: pnpm install --frozen-lockfile + - name: Build Layout Engine (WASM) + run: pnpm --filter @btuin/layout-engine build + - name: Run Limit Test run: | pnpm run profiler:limit | tee benchmark_result.txt From fc15555b3bf11680ce16af44f5fd5aec0b13f9a2 Mon Sep 17 00:00:00 2001 From: HAL <68320771+HALQME@users.noreply.github.com> Date: Mon, 15 Dec 2025 13:38:49 +0900 Subject: [PATCH 08/12] fix rust setup --- .github/workflows/ci.yml | 11 ++++++----- .github/workflows/profiler.yml | 11 ++++++----- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0e9bf74..5de7355 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,13 +14,14 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Setup Rust - uses: dtolnay/rust-toolchain@stable + - name: Install Rust toolchain + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + profile: minimal - name: Install wasm-pack - uses: jetli/wasm-pack-action@v4 - with: - version: "latest" + run: cargo install wasm-pack - name: Setup Bun uses: oven-sh/setup-bun@v1 diff --git a/.github/workflows/profiler.yml b/.github/workflows/profiler.yml index 3da3fbf..7bb6f59 100644 --- a/.github/workflows/profiler.yml +++ b/.github/workflows/profiler.yml @@ -19,13 +19,14 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Setup Rust - uses: dtolnay/rust-toolchain@stable + - name: Install Rust toolchain + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + profile: minimal - name: Install wasm-pack - uses: jetli/wasm-pack-action@v4 - with: - version: "latest" + run: cargo install wasm-pack - name: Setup Bun uses: oven-sh/setup-bun@v1 From 70621d832554139526a65978e6ade9bcc4856d59 Mon Sep 17 00:00:00 2001 From: HAL <68320771+HALQME@users.noreply.github.com> Date: Mon, 15 Dec 2025 13:43:45 +0900 Subject: [PATCH 09/12] fix --- .github/workflows/build.yml | 7 +++++++ .github/workflows/ci.yml | 6 ++---- .github/workflows/profiler.yml | 6 ++---- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3e357a4..6eae479 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -12,6 +12,13 @@ jobs: steps: - uses: actions/checkout@v4 + - name: Install Rust toolchain + uses: dtolnay/rust-toolchain@stable + with: + toolchain: stable + + - uses: jetli/wasm-pack-action@v0.4.0 + - name: Setup Bun uses: oven-sh/setup-bun@v1 with: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5de7355..ab2a9c0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,13 +15,11 @@ jobs: - uses: actions/checkout@v4 - name: Install Rust toolchain - uses: actions-rs/toolchain@v1 + uses: dtolnay/rust-toolchain@stable with: toolchain: stable - profile: minimal - - name: Install wasm-pack - run: cargo install wasm-pack + - uses: jetli/wasm-pack-action@v0.4.0 - name: Setup Bun uses: oven-sh/setup-bun@v1 diff --git a/.github/workflows/profiler.yml b/.github/workflows/profiler.yml index 7bb6f59..22fedb1 100644 --- a/.github/workflows/profiler.yml +++ b/.github/workflows/profiler.yml @@ -20,13 +20,11 @@ jobs: - uses: actions/checkout@v4 - name: Install Rust toolchain - uses: actions-rs/toolchain@v1 + uses: dtolnay/rust-toolchain@stable with: toolchain: stable - profile: minimal - - name: Install wasm-pack - run: cargo install wasm-pack + - uses: jetli/wasm-pack-action@v0.4.0 - name: Setup Bun uses: oven-sh/setup-bun@v1 From 0a9ecf049247decc44e5d43dbf23bf591d0d9233 Mon Sep 17 00:00:00 2001 From: HAL <68320771+HALQME@users.noreply.github.com> Date: Mon, 15 Dec 2025 15:15:52 +0900 Subject: [PATCH 10/12] Run package build script in CI Replace CI's direct filtered command with a project build script that invokes the @btuin/layout-engine via pnpm. Update package.json build to use pnpm --filter @btuin/layout-engine build. Add "pkg" to .gitignore. --- .github/workflows/ci.yml | 2 +- .gitignore | 1 + package.json | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ab2a9c0..802366a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -48,7 +48,7 @@ jobs: run: pnpm install --frozen-lockfile - name: Build Layout Engine (WASM) - run: pnpm --filter @btuin/layout-engine build + run: pnpm run build - name: Check Formatting run: pnpm run format --check diff --git a/.gitignore b/.gitignore index 91a05eb..00645f5 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ out out.* dist *.tgz +pkg profiles/*.json # code coverage diff --git a/package.json b/package.json index be84230..4372ceb 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ ], "scripts": { "start": "bun run", - "build": "bun run --cwd packages/btuin build.ts", + "build": "pnpm --filter @btuin/layout-engine build", "lint": "oxlint packages/*", "lint:fix": "oxlint packages/* --fix", "format": "oxfmt packages/*", From 6c9b2df0825c5901437dfe9f50435c3dc5b1787a Mon Sep 17 00:00:00 2001 From: HAL <68320771+HALQME@users.noreply.github.com> Date: Mon, 15 Dec 2025 15:20:36 +0900 Subject: [PATCH 11/12] Update CI workflows and replace Bun file ops Bump oven-sh/setup-bun to v2 and pnpm/action-setup to v4 in workflow files Replace Bun.$ mkdir and Bun.write in profiler.ts with node fs mkdirSync and writeFileSync, add import and error handling. Also change profiler workflow build step to use pnpm run build --- .github/workflows/build.yml | 4 ++-- .github/workflows/ci.yml | 4 ++-- .github/workflows/profiler.yml | 6 +++--- packages/btuin/src/runtime/profiler.ts | 11 ++++++++--- 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6eae479..afa9d76 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -20,12 +20,12 @@ jobs: - uses: jetli/wasm-pack-action@v0.4.0 - name: Setup Bun - uses: oven-sh/setup-bun@v1 + uses: oven-sh/setup-bun@v2 with: bun-version: latest - name: Setup pnpm - uses: pnpm/action-setup@v2 + uses: pnpm/action-setup@v4 with: run_install: false diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 802366a..48f0146 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,12 +22,12 @@ jobs: - uses: jetli/wasm-pack-action@v0.4.0 - name: Setup Bun - uses: oven-sh/setup-bun@v1 + uses: oven-sh/setup-bun@v2 with: bun-version: latest - name: Setup pnpm - uses: pnpm/action-setup@v2 + uses: pnpm/action-setup@v4 with: run_install: false diff --git a/.github/workflows/profiler.yml b/.github/workflows/profiler.yml index 22fedb1..a645e8c 100644 --- a/.github/workflows/profiler.yml +++ b/.github/workflows/profiler.yml @@ -27,12 +27,12 @@ jobs: - uses: jetli/wasm-pack-action@v0.4.0 - name: Setup Bun - uses: oven-sh/setup-bun@v1 + uses: oven-sh/setup-bun@v2 with: bun-version: latest - name: Setup pnpm - uses: pnpm/action-setup@v2 + uses: pnpm/action-setup@v4 with: run_install: false @@ -53,7 +53,7 @@ jobs: run: pnpm install --frozen-lockfile - name: Build Layout Engine (WASM) - run: pnpm --filter @btuin/layout-engine build + run: pnpm run build - name: Run Limit Test run: | diff --git a/packages/btuin/src/runtime/profiler.ts b/packages/btuin/src/runtime/profiler.ts index 9e0ea47..ad3e673 100644 --- a/packages/btuin/src/runtime/profiler.ts +++ b/packages/btuin/src/runtime/profiler.ts @@ -1,5 +1,6 @@ import type { Buffer2D } from "@btuin/renderer"; import path from "node:path"; +import { mkdirSync, writeFileSync } from "node:fs"; export interface ProfileOptions { /** @@ -337,7 +338,7 @@ export class Profiler { const dir = path.dirname(this.options.outputFile); if (dir && dir !== ".") { try { - const _ = Bun.$`mkdir -p ${dir}`; + mkdirSync(dir, { recursive: true }); } catch {} } await Bun.write(this.options.outputFile, output); @@ -350,9 +351,13 @@ export class Profiler { const dir = path.dirname(this.options.outputFile); if (dir && dir !== ".") { try { - const _ = Bun.$`mkdir -p ${dir}`; + mkdirSync(dir, { recursive: true }); } catch {} } - Bun.write(this.options.outputFile, output).then(); + try { + writeFileSync(this.options.outputFile, output); + } catch (error) { + console.error("Failed to flush profiler results synchronously:", error); + } } } From 44b9db2b5a757f79783ed1e1c515284f5f1d9f31 Mon Sep 17 00:00:00 2001 From: HAL <68320771+HALQME@users.noreply.github.com> Date: Mon, 15 Dec 2025 15:31:19 +0900 Subject: [PATCH 12/12] Refactor profiler scripts and .gitignore Rename test variables to UPPER_CASE, use import.meta.dirname for profile output paths, remove unused WARMUP_FRAMES, and update .gitignore to ignore nested profiles JSON. Miscellaneous style and formatting fixes (semicolons, spacing, minor console formatting). --- .gitignore | 2 +- scripts/profiler-core.ts | 2 -- scripts/profiler-layout.spec.ts | 32 ++++++++++++++++---------------- scripts/profiler-limit.spec.ts | 31 ++++++++++++++++--------------- scripts/profiler-stress.spec.ts | 32 ++++++++++++++++---------------- 5 files changed, 49 insertions(+), 50 deletions(-) diff --git a/.gitignore b/.gitignore index 00645f5..db6f18a 100644 --- a/.gitignore +++ b/.gitignore @@ -7,7 +7,7 @@ out.* dist *.tgz pkg -profiles/*.json +**/profiles/*.json # code coverage coverage diff --git a/scripts/profiler-core.ts b/scripts/profiler-core.ts index dcae0bf..adeb728 100644 --- a/scripts/profiler-core.ts +++ b/scripts/profiler-core.ts @@ -1,7 +1,5 @@ import type { TerminalAdapter } from "../packages/btuin/src/runtime"; -const WARMUP_FRAMES = 5; - type FrameMetrics = { id: number; time: number; diff --git a/scripts/profiler-layout.spec.ts b/scripts/profiler-layout.spec.ts index ccb11e7..f6166f3 100644 --- a/scripts/profiler-layout.spec.ts +++ b/scripts/profiler-layout.spec.ts @@ -11,11 +11,11 @@ import { createNullTerminalAdapter, printSummary, type ProfilerLog } from "./pro // // It uses the same harness style as profiler-stress.test.ts (createApp + Profiler JSON output). -const n = 4_000; -const frames = 120; -const intervalMs = 16; -const hud = false; -const out = `profiles/layout-${Date.now()}.json`; +const N = 4_000; +const FRAMES = 120; +const INTERVAL_MS = 16; +const HUD = false; +const OUTPUT_FILE = `${import.meta.dirname}/profiles/layout-${Date.now()}.json`; const tick = ref(0); let resolveFinished: (() => void) | null = null; @@ -24,7 +24,7 @@ const finished = new Promise((resolve) => { }); // Reuse leaf Text nodes to avoid making this purely an allocation benchmark. -const leaves = Array.from({ length: n }, (_, i) => Text(`item ${i}`).foreground("gray")); +const leaves = Array.from({ length: N }, (_, i) => Text(`item ${i}`).foreground("gray")); function buildTree(t: number) { const root = Block() @@ -32,7 +32,7 @@ function buildTree(t: number) { .gap(t % 4) .padding((t % 3) as 0 | 1 | 2); - root.add(Text(`layout-change-stress n=${n} tick=${t}`).foreground("cyan")); + root.add(Text(`layout-change-stress n=${N} tick=${t}`).foreground("cyan")); for (let i = 0; i < leaves.length; i++) { const leaf = leaves[i]!; @@ -67,32 +67,32 @@ const app = createApp({ const timer = setInterval(() => { tick.value++; produced++; - if (produced >= frames) { + if (produced >= FRAMES) { clearInterval(timer); resolveFinished?.(); } - }, intervalMs); + }, INTERVAL_MS); return () => buildTree(tick.value); }, terminal: createNullTerminalAdapter({ rows: 40, cols: 120 }), profile: { enabled: true, - hud, - outputFile: out, - maxFrames: frames, + hud: HUD, + outputFile: OUTPUT_FILE, + maxFrames: FRAMES, nodeCount: true, }, }); describe("Many Layout Change Test", async () => { - Bun.gc(true) + Bun.gc(true); const appInstance = await app.mount(); expect(appInstance.getComponent()).not.toBeNull(); await finished; appInstance.unmount(); - expect(existsSync(out)).toBe(true); - const log = (await import(`../${out}`, { with: { type: "json" } })) as ProfilerLog; + expect(existsSync(OUTPUT_FILE)).toBe(true); + const log = (await import(OUTPUT_FILE, { with: { type: "json" } })) as ProfilerLog; printSummary(log); const frames = log.frames; @@ -100,7 +100,7 @@ describe("Many Layout Change Test", async () => { const steadyFrames = frames.slice(5); test("Startup Latency (Frame 1) < 100ms", () => { - expect(firstFrame).toBeDefined() + expect(firstFrame).toBeDefined(); expect(firstFrame!.frameMs).toBeLessThan(100); }); diff --git a/scripts/profiler-limit.spec.ts b/scripts/profiler-limit.spec.ts index 2b787b0..cca1486 100644 --- a/scripts/profiler-limit.spec.ts +++ b/scripts/profiler-limit.spec.ts @@ -12,7 +12,7 @@ const STEP_NODES = 100; // Nodes added per frame const INTERVAL_MS = 2; // Update interval const ITERATIONS = 5; // Number of times to repeat the test -const OUTPUT_FILE = `profiles/limit-${Date.now()}.json`; +const OUTPUT_FILE = `${import.meta.dirname}/profiles/limit-${Date.now()}.json`; async function runSingleIteration(iterationIndex: number): Promise { const tick = ref(0); @@ -78,7 +78,7 @@ function calculateStats(values: number[]) { const min = Math.min(...values); const max = Math.max(...values); - const squaredDiffs = values.map(v => Math.pow(v - avg, 2)); + const squaredDiffs = values.map((v) => Math.pow(v - avg, 2)); const avgSquaredDiff = squaredDiffs.reduce((a, b) => a + b, 0) / values.length; const stdDev = Math.sqrt(avgSquaredDiff); @@ -96,12 +96,12 @@ describe("Scalability Limit Test (Statistical)", async () => { ]; const results: Record = {}; - thresholds.forEach(t => results[t.fps] = []); + thresholds.forEach((t) => (results[t.fps] = [])); for (let i = 0; i < ITERATIONS; i++) { Bun.stdout.write(` Run ${i + 1}/${ITERATIONS}... `); - Bun.gc(true) + Bun.gc(true); const log = await runSingleIteration(i); @@ -116,9 +116,9 @@ describe("Scalability Limit Test (Statistical)", async () => { const validFrames = smoothedFrames.slice(5); for (const t of thresholds) { - expect(results[t.fps]).toBeDefined() + expect(results[t.fps]).toBeDefined(); const limitFrame = validFrames.find((f) => f.avgMs > t.ms); - const limitNodeCount = limitFrame ? limitFrame.nodeCount : (START_NODES + FRAMES * STEP_NODES); + const limitNodeCount = limitFrame ? limitFrame.nodeCount : START_NODES + FRAMES * STEP_NODES; results[t.fps]!.push(limitNodeCount); } @@ -126,23 +126,24 @@ describe("Scalability Limit Test (Statistical)", async () => { } console.log("\n" + "=".repeat(52)); - console.log(` Performance Limits Report ${ITERATIONS} runs`); + console.log(`${" ".repeat(10)}Performance Limits Report ${ITERATIONS} runs`); console.log("=".repeat(52)); console.log(`| FPS Target | Avg Nodes | Min | Max | Std Dev |`); - console.log(`|${"-".repeat(12)}|${"-".repeat(11)}|${"-".repeat(7)}|${"-".repeat(7)}|${"-".repeat(9)}|`); + console.log( + `|${"-".repeat(12)}|${"-".repeat(11)}|${"-".repeat(7)}|${"-".repeat(7)}|${"-".repeat(9)}|`, + ); for (const t of thresholds) { - expect(results[t.fps]).toBeDefined() + expect(results[t.fps]).toBeDefined(); const stats = calculateStats(results[t.fps]!); - // If stats.avg is the max possible nodes, it implies we never hit the limit - const note = stats.avg >= (START_NODES + FRAMES * STEP_NODES) ? "+" : ""; + const note = stats.avg >= START_NODES + FRAMES * STEP_NODES ? "+" : ""; console.log( `| ${t.fps.toString().padStart(3)} FPS | ` + - `${(Math.round(stats.avg) + note).toString().padEnd(9)} | ` + - `${Math.round(stats.min).toString().padEnd(5)} | ` + - `${Math.round(stats.max).toString().padEnd(5)} | ` + - `±${Math.round(stats.stdDev).toString().padEnd(6)} |` + `${(Math.round(stats.avg) + note).toString().padEnd(9)} | ` + + `${Math.round(stats.min).toString().padEnd(5)} | ` + + `${Math.round(stats.max).toString().padEnd(5)} | ` + + `±${Math.round(stats.stdDev).toString().padEnd(6)} |`, ); } console.log("=".repeat(52)); diff --git a/scripts/profiler-stress.spec.ts b/scripts/profiler-stress.spec.ts index 72ccecc..7414e59 100644 --- a/scripts/profiler-stress.spec.ts +++ b/scripts/profiler-stress.spec.ts @@ -4,11 +4,11 @@ import { existsSync } from "node:fs"; import { createApp, ref, Block, Text, type TerminalAdapter } from "../packages/btuin"; import { createNullTerminalAdapter, printSummary, type ProfilerLog } from "./profiler-core"; -const n = 10_000; -const frames = 120; -const intervalMs = 16; -const hud = false; -const out = `profiles/stress-${Date.now()}.json`; +const N = 10_000; +const FRAMES = 120; +const INTERVAL_MS = 16; +const HUD = false; +const OUTPUT_FILE = `${import.meta.dirname}/profiles/stress-${Date.now()}.json`; const tick = ref(0); let resolveFinished: (() => void) | null = null; @@ -17,7 +17,7 @@ const finished = new Promise((resolve) => { }); // Pre-build a large, mostly-static tree to stress layout+render traversal. -const items = Array.from({ length: n }, (_, i) => Text(`item ${i}`).foreground("gray")); +const items = Array.from({ length: N }, (_, i) => Text(`item ${i}`).foreground("gray")); const header = Text("stress").foreground("cyan"); const root = Block().direction("column"); root.add(header); @@ -29,35 +29,35 @@ const app = createApp({ const timer = setInterval(() => { tick.value++; produced++; - if (produced >= frames) { + if (produced >= FRAMES) { clearInterval(timer); resolveFinished?.(); } - }, intervalMs); + }, INTERVAL_MS); return () => { - header.content = `stress n=${n} tick=${tick.value}`; + header.content = `stress n=${N} tick=${tick.value}`; return root; }; }, terminal: createNullTerminalAdapter({ rows: 40, cols: 120 }), profile: { enabled: true, - hud, - outputFile: out, - maxFrames: frames, + hud: HUD, + outputFile: OUTPUT_FILE, + maxFrames: FRAMES, nodeCount: true, }, }); describe("Multi Element Stress Test", async () => { - Bun.gc(true) + Bun.gc(true); const appInstance = await app.mount(); expect(appInstance.getComponent()).not.toBeNull(); await finished; appInstance.unmount(); - expect(existsSync(out)).toBe(true); - const log = (await import(`../${out}`, { with: { type: "json" } })) as ProfilerLog; + expect(existsSync(OUTPUT_FILE)).toBe(true); + const log = (await import(OUTPUT_FILE, { with: { type: "json" } })) as ProfilerLog; printSummary(log); const frames = log.frames; @@ -65,7 +65,7 @@ describe("Multi Element Stress Test", async () => { const steadyFrames = frames.slice(5); test("Startup Latency (Frame 1) < 100ms", () => { - expect(firstFrame).toBeDefined() + expect(firstFrame).toBeDefined(); expect(firstFrame!.frameMs).toBeLessThan(100); });