sgcGrid Benchmarks

Every number on this page was measured on one machine with the sgcGrid QA performance gates and two benchmark programs that ship with the QA suite. Nothing is estimated or extrapolated. Run the same programs on your own hardware and database to get your numbers.

The headline figures

MeasurementWin32Win64
1920 x 1080 frame of a 100,000 row grid, 12 columns (QA gate C1)1.47 ms1.29 ms
The same frame with flashing cells and 3 format rules1.67 ms1.46 ms
Live updates from a worker thread into a sorted 1,000 row grid, frames rendered at 60 Hz1,000 updates/s at 60.0 fps, 0 missed frames1,000 updates/s at 60.0 fps, 0 missed frames
Highest update rate of one worker thread while the same grid holds 60 fps1,552,858 updates/s2,001,921 updates/s
Server mode, SQLite table of 10,000,000 rows: open to the first painted pagenot run117.3 ms (2.1 ms with the estimated count)

Measured on 2026-11-04. The tables below give the method, the machine and every figure.

How the numbers are measured

Frames

A frame is the visible window of a 1920 x 1080 grid, rendered headless by TsgcGridRenderer to the raster canvas, the same code that paints the VCL and FireMonkey grids. There is no window and no GPU in the loop. The grid scrolls a little every frame, as a live grid does. C1 and the other frame gates take the median of 5 runs of 60 frames after a warm-up.

Model operations

Grouping, filtering, sorting and summaries run on the grid data model with no renderer. Each figure is the median of 5 runs after a warm-up, or the best of 12 interleaved runs where the gate says so. Every gate has a budget, and the QA run fails when a figure goes over it.

Live updates

A worker thread writes price updates with the thread safe UpdateRow, as the LiveTicker demo does. The main thread renders a frame every 16.67 ms (60 Hz). Every frame re-sorts the changed view, as a painted grid does. The benchmark reports the updates per second written, the frames per second rendered, the frames that missed their slot and the render time per frame.

Server mode

TsgcGridServerProvider_DataSet pages a generated table through FireDAC. Each step ends when its rows are loaded and the frame is painted. Each figure is the median of 5 runs after a warm-up, with the database file in the operating system cache. Jumps land 2,000 rows apart from run to run, so every run reads from the database and not from the page cache of the grid.

The test machine

CPUIntel Core Ultra 5 245T, 14 cores, 14 logical processors
Memory31.5 GB
DiskNVMe SSD, Phison 1 TB
Operating systemWindows 11 Pro 26H2, build 26300.9711
CompilerDelphi 13 (compiler 37.0), Win32 and Win64 release builds
DatabaseSQLite 3.42.0 through FireDAC, embedded and statically linked
SourcesgcGrid development tree of 2026-11-04 (svn revision 20169 with local changes)

The machine was a developer workstation, not an isolated benchmark server. Each heavy run held a machine wide lock, so no build or test ran at the same time.

QA performance gates

The perf group of the sgcGrid QA suite, run alone on Win32 and Win64. The budget is the limit the gate enforces (Win32 / Win64).

GateWhat is measuredWin32Win64Budget
C1Flat frame 1920 x 1080, 12 columns, 100,000 rows1.47 ms1.29 ms4.09 / 4.32 ms
StyledThe same frame, flashing cells and 3 format rules (average of 60 frames)1.67 ms1.46 ms25 / 16 ms
GW3Frame with find highlights, 100,000 rows1.43 ms1.75 ms25 / 16 ms
GW5Frame with 20 columns, 3 band levels, 2 frozen columns, 100,000 rows1.62 ms1.42 ms25 / 16 ms
GW7Frame with image, progress and 30 point sparkline columns, 100,000 rows2.20 ms3.20 ms25 / 16 ms
F1Frame with 2 frozen columns and a footer, scrolled both ways, 100,000 rows0.56 ms0.50 ms25 / 16 ms
G4Frame of 1,000,000 rows grouped by 2 columns, all expanded0.49 ms0.48 ms25 / 16 ms
D1Frame with 3 visible detail bands of 50 rows each2.47 ms2.65 ms25 / 16 ms
G1Group 100,000 rows by 2 columns, 2 summaries, build and flatten15.11 ms11.98 ms60 / 40 ms
G2Group 1,000,000 rows by 2 columns, 2 summaries, build and flatten155.37 ms132.61 ms700 / 450 ms
G3Expand or collapse one group of the 1,000,000 row view4.16 ms3.28 ms25 / 15 ms
G5Footer summaries, 5 columns of 100,000 rows5.64 ms2.34 ms25 / 15 ms
T1Tree of 100,000 rows, depth up to 8, build and flatten fully expanded20.42 ms22.80 ms90 / 60 ms
GW0Sorted view rebuild, 1,000,000 rows253.45 ms240.29 ms268.24 / 259.62 ms
GW1Distinct values of a 1,000 member text column, with a cascading filter, 1,000,000 rows55.61 ms48.42 ms450 / 300 ms
GW2Filter with a 500 of 1,000 value list plus a condition, 1,000,000 rows50.75 ms48.02 ms225 / 150 ms
M1Memory of the line view above the data, 1,000,000 rows grouped by 2 columns20.07 MB20.09 MB32 MB
X1XLSX export of 100,000 rows x 12 columns, 2 group levels, summaries1,693.87 ms1,002.71 ms4,500 / 3,000 ms
L2Log viewer following the tail while a thread appends 10,000 lines per second: frames painted per second38.87 fps38.67 fps20 fps minimum
L2The same run: 99th percentile of the input delay4.22 ms2.83 ms33 ms

Live updates at 60 fps

sgcGridBench_Live: a worker thread writes price, change, volume and time of a random row with UpdateRow, while the main thread renders a sorted, flashing 1920 x 1080 grid every 16.67 ms. 5 seconds per case. A missed slot is a frame that finished after the start of the next one.

RowsTarget ratePlatformUpdates/sFrames/sMissed slotsRender medianRender p99Render max
1,0001,000/sWin321,00060.001.28 ms2.46 ms2.57 ms
1,0001,000/sWin641,00060.001.36 ms2.41 ms2.45 ms
1,00010,000/sWin329,99860.001.43 ms2.79 ms2.98 ms
1,00010,000/sWin649,99860.001.29 ms2.46 ms3.17 ms
1,000as fast as possibleWin321,552,85860.001.26 ms3.09 ms3.35 ms
1,000as fast as possibleWin642,001,92160.001.26 ms2.54 ms3.28 ms
100,0001,000/sWin321,00060.0010.52 ms13.72 ms15.92 ms
100,0001,000/sWin641,00060.0010.50 ms13.99 ms14.68 ms
100,00010,000/sWin329,96647.66214.70 ms40.33 ms42.03 ms
100,00010,000/sWin649,99754.22913.59 ms35.10 ms39.86 ms

A sorted grid of 100,000 rows re-sorts its view in every frame where the sorted column changed, so its render time grows with the row count. Updates to columns that are not sorted keep the view, and MaxFPS can lower the frame rate of a grid that only needs to look live.

Database tables of 1,000,000 and 10,000,000 rows

sgcGridBench_Server on SQLite 3.42.0, Win64. The table has 12 columns of mixed types (integer, text, float, date and time, boolean), an indexed integer key and an indexed customer column, with deterministic data. Every step ends with its rows loaded and the 1920 x 1080 frame painted. Median of 5 runs after a warm-up.

Step1,000,000 rows10,000,000 rowsWhat runs on the database
Open to the first painted page2.8 ms117.3 msColumns from the schema, exact COUNT(*), first page
Open with the estimated count2.1 ms2.1 msCountMode = gscEstimated: first page only, the count grows while pages come back full
Exact row count0.2 ms115.6 msSELECT COUNT(*)
Jump to the middle40.1 ms378.8 msOne page at the middle row, LIMIT and OFFSET
Jump to the end75.0 ms735.4 msThe last page, LIMIT and OFFSET
Sort by an indexed column2.5 ms119.3 msORDER BY customer through its index, plus the exact count of the new query
Sort by a column with no index106.9 ms1,169.3 msORDER BY amount DESC, a full scan
Filter builder condition97.5 ms975.7 msWHERE region = 'North' AND qty > 50, count and first page (40,000 and 400,000 rows match)
Server grouping, group rows painted266.5 ms3,917.8 msGROUP BY region (12 groups) with the row count of each group, a full scan
Process memory after the run76.5 MB75.7 MBWorking set of the benchmark process, SQLite page cache included

The grid itself reads only the pages on screen, so its own cost stays flat. What grows with the table is the work of the database: the exact count, the OFFSET of a deep jump, and a sort or a grouping on a column with no index. An index on the sorted or grouped column, or the estimated count, keeps those steps short. Generating the 10,000,000 row table took 42.5 s, and a second run on the same file gave figures within 25% of these.

SQL Server, PostgreSQL, Firebird and tables of 100,000,000 rows are measured with the same harness. Their figures will be added here when they have been run. Until then, no number is published for them.

Measure on your machine and your database

The benchmark programs are in the QA folder of the sgcUI source, QA\Grid\Bench. They are console programs with no IDE project.

Build

build_bench.bat builds sgcGridBench_Server.exe and sgcGridBench_Live.exe for Win32 and Win64 with Delphi 13 into bin\win32 and bin\win64, and copies the ini file next to them.

Server mode

sgcGridBench_Server.exe --rows=10000000 creates the table when it is missing, then measures every step and writes a Markdown report and a CSV line per figure. Options: --ini, --rows, --runs, --db, --generate, --out.

Another engine

Edit sgcGridBench_Server.ini: DriverName is the FireDAC driver (MSSQL, PG, FB or SQLite), every key of [Params] goes to the connection, and Dialect selects the SQL dialect. The ini holds a sample for each engine.

Live updates and QA gates

sgcGridBench_Live.exe --seconds=5 runs the live cases above. The client gates are the perf group of the QA suite, sgcGridQA.exe --group=perf, which appends every figure to sgcGridQA_perf.txt. Run it alone on an idle machine.

[Connection]
DriverName=PG

[Params]
Server=localhost
Port=5432
Database=bench
User_Name=postgres
Password=secret

[Bench]
Dialect=postgresql
Table=bench_orders
Rows=10000000
Runs=5
Best value: All-AccessEvery eSeGeCe product, Premium Support included, from €1,059/year.
See All-Access pricing

Try sgcGrid on your data

Download the sgcUI trial, open the ServerModeAndCards and LiveTicker demos, then point the benchmark at your own database.