Skip to content

RevoGrid Benchmarks

This page records a reproducible local RevoGrid benchmark run. The numbers below come from the benchmark harness in this repository, executed against a local VitePress dev server on July 5, 2026.

Benchmark numbers are environment-dependent. Treat these as a published run with its machine, browser, dataset, and renderer setup documented, not as a universal guarantee for every application.

Dataset and renderer

FieldValue
Row count100,000
Column count100
Total logical cells10,000,000
Cell renderer complexityMixed renderer harness: 1 pinned custom name cell with status badge, 1 custom status badge column, 8 custom formatted numeric columns, 90 plain numeric columns
Editors enabledBuilt-in editing available; latency measured through targeted setDataAt updates
Pinned rows or columns1 pinned start column
Row height36 px
Column width110 px default, with custom widths for pinned/status columns

Cell renderer complexity must be documented because it often dominates large-grid performance. Record whether the benchmark uses plain text cells, lightweight formatters, custom DOM templates, framework components, images, icons, badges, charts, or validation state.

Results

MetricResultMeasurement notes
Initial render time34.10 msTime from assigning columns and source to first aftergridrender. Data generation is excluded.
Scrolling FPS60 FPSNormalized to a standard 60Hz display target. The raw headless Chromium measurement was 101 FPS and is not display refresh-rate capped.
Dropped frames2Frames with a gap greater than 20 ms during the scripted scroll pass.
Memory usage after warmup445.84 MiB medianMedian of 5 Chromium performance.memory.usedJSHeapSize samples after initial render and 1 second idle warmup.
Memory usage after interaction loop482.06 MiB medianMedian of 5 Chromium heap samples after scripted scroll and 30 targeted cell updates.
Edit latency, median0.00 msMedian of 30 setDataAt targeted cell updates. Browser timer precision rounds very small samples to 0.
Edit latency, p950.10 msp95 of 30 setDataAt targeted cell updates.
DOM node count807Counted after warmup for the whole benchmark document.
Rendered rows60Rendered viewport rows after warmup.
Rendered data cells260Rendered data cells after warmup.

Memory verification

The benchmark reads Chromium heap five times at each checkpoint and publishes both samples and the median in /benchmarks/result.json.

CheckpointSamplesMedian
After warmup445.84, 445.84, 445.84, 445.84, 445.84 MiB445.84 MiB
After interaction loop482.06, 482.06, 482.06, 482.06, 482.06 MiB482.06 MiB

Comparison methodology

Use the same benchmark harness for every grid being compared. The benchmark should keep application code as neutral as possible and document every difference that cannot be normalized.

  • Use the same test machine, operating system, browser, browser version, and display refresh rate.
  • Run cold and warm measurements separately.
  • Use the same row count, column count, data shape, renderer complexity, row height, and column width.
  • Repeat each scenario and publish the median result. Publish p95 when enough samples are collected.
  • Measure scrolling with scripted scroll, not only manual observation. This run measures vertical scroll FPS.
  • Measure memory after initial warmup and again after a long interaction loop.
  • Measure edit latency from the input event to the committed grid update.
  • Keep virtualization settings, pinned areas, custom renderers, filtering, sorting, and editors visible in the benchmark configuration.
  • Publish the benchmark source and run instructions before publishing headline numbers.

Recommended scenarios:

ScenarioDatasetWhat to measure
Initial render100,000 rows x 100 columnsMount time, first usable interaction, memory after warmup
Tall scrolling100,000 rows x 100 columnsScroll FPS, dropped frames, blank gaps
Wide grid100,000 rows x 100 columnsColumn virtualization behavior through the 100-column configuration
Custom cells100,000 rows x 100 columnsRender time, memory, scroll smoothness
Editing100,000 rows x 100 columnsTargeted cell update latency through setDataAt
Long session100,000 rows x 100 columnsHeap after scripted scroll and repeated targeted updates

Runnable benchmark repo

The benchmark is runnable from this docs workspace:

sh
pnpm exec vitepress dev --host 127.0.0.1 --port 5173
node scripts/run-benchmark.mjs

The script writes:

  • public/benchmarks/result.json
  • public/benchmarks/revo-grid-benchmark.png
  • public/benchmarks/revo-grid-benchmark.webm

Screenshots and video

AssetStatusNotes
Initial render screenshotOpen PNGCaptured from the local benchmark harness after render and interactions.
Scroll benchmark videoOpen WebMCaptured from the Playwright benchmark context.
Raw result dataOpen JSONMachine, browser, dataset, metrics, and asset paths.
Browser performance traceNo trace artifact generatedThe run captured result JSON, screenshot, and video.

RevoGrid benchmark screenshot