// measured, not promised

The stress test
is on this page.

One million rows are loaded into the grid below — right now, in your browser. Scroll it as hard as you can and watch the frame meter.

Rows virtualized, constant DOM
Sustained scroll on desktop
Minified + gzipped
Runtime dependencies
1,000,000 rows · virtual scroll 0 fps
#
Instrument
Desk
Notional
Delta
Vega
P&L
0
INSTR-0000000
Commodities
$5.2M
0.195
19.1k
+$44,413
1
INSTR-0000001
Rates
$24.7M
-0.355
53.8k
−$60,957
2
INSTR-0000002
Commodities
$39.2M
0.516
13.9k
+$22,547
3
INSTR-0000003
FX
$37.2M
0.018
49.0k
+$37,938
4
INSTR-0000004
Commodities
$27.2M
-0.888
41.4k
−$106,969
5
INSTR-0000005
FX
$43.0M
-0.785
81.5k
−$87,065
6
INSTR-0000006
Structured
$32.1M
0.328
112.8k
−$98,632
7
INSTR-0000007
Structured
$36.8M
-0.393
8.0k
−$67,328
8
INSTR-0000008
Commodities
$30.3M
-0.164
88.7k
+$116,190
9
INSTR-0000009
Structured
$39.8M
0.241
99.5k
−$23,232
10
INSTR-0000010
Commodities
$4.9M
-0.043
43.0k
−$65,625
11
INSTR-0000011
FX
$42.6M
-0.308
108.0k
−$53,867
12
INSTR-0000012
Credit
$23.6M
0.989
78.3k
−$69,152
13
INSTR-0000013
Structured
$38.8M
0.737
29.9k
+$20,333
14
INSTR-0000014
Rates
$11.0M
-1.000
105.6k
+$36,966
15
INSTR-0000015
Commodities
$1.5M
0.155
94.4k
+$94,499
16
INSTR-0000016
Credit
$31.5M
0.435
84.5k
−$35,315
17
INSTR-0000017
Rates
$3.6M
-0.816
106.7k
−$94,236
18
INSTR-0000018
Structured
$26.9M
0.247
49.5k
+$9,559
19
INSTR-0000019
Credit
$48.1M
0.288
48.2k
−$68,737
20
INSTR-0000020
Commodities
$23.9M
0.893
61.1k
−$84,709
21
INSTR-0000021
Rates
$42.1M
0.535
27.0k
−$6,965
22
INSTR-0000022
Equities
$18.5M
0.759
12.9k
−$78,251
23
INSTR-0000023
Structured
$35.1M
0.726
43.6k
+$16,988
24
INSTR-0000024
Credit
$21.7M
-0.301
6.0k
+$130,845
25
INSTR-0000025
FX
$17.3M
0.886
8.3k
−$78,355
26
INSTR-0000026
FX
$6.1M
0.779
31.7k
−$24,801
60 / 1,000,000 rows

Rows are generated on demand — only the visible window ever exists in the DOM. The frame meter is a plain requestAnimationFrame counter, measured live on your machine.

Methodology

How are the million rows loaded?

The data source generates rows deterministically from the row index, on demand. The grid requests only the window the viewport needs (60 rows at a time), so total memory stays flat no matter how far you scroll.

What does the fps meter measure?

A requestAnimationFrame loop counts frames rendered by your browser over each second, on your hardware, while this page runs. It is not a recording and not a lab number.

How is the bundle size measured?

The production build is minified and gzipped — the same transformation your app bundler applies — giving 170.4 KB (112.3 KB with Brotli). The number is produced by a script and checked in continuous integration on every change, so it can never silently drift; the library also adds zero third-party runtime dependencies to your install.

Why virtual scroll instead of pagination tricks?

Only visible rows enter the DOM, positioned with binary-search scroll mapping. Row components are recycled, change detection is OnPush + signals, and no layout thrash occurs at any scroll speed — continuously verified: scrolling ten thousand rows keeps the DOM a bounded window and does at most one layout per scroll step.

See the window stay bounded, live — Row Virtualisation