sgcGrid 基准测试

本页的每个数字都是在同一台机器上,使用 sgcGrid 的 QA 性能关卡和 QA 套件附带的两个基准测试程序测得的。没有任何估算或外推。请在您自己的硬件和数据库上运行同样的程序,得到属于您的数据。

主要数据

测量项Win32Win64
100,000 行网格的 1920 x 1080 帧,12 列(QA 关卡 C1)1.47 毫秒1.29 毫秒
同一帧,带闪烁单元格和 3 条格式规则1.67 毫秒1.46 毫秒
工作线程向已排序的 1,000 行网格实时更新,以 60 Hz 渲染帧每秒 1,000 次更新,60.0 fps,0 次丢帧每秒 1,000 次更新,60.0 fps,0 次丢帧
同一网格保持 60 fps 时,单个工作线程的最高更新速率1,552,858 次更新/秒2,001,921 次更新/秒
服务器模式,10,000,000 行 SQLite 表:打开到绘制出第一页未运行117.3 毫秒(使用估算行数为 2.1 毫秒)

测量日期:2026-11-04。下方各表给出了测试方法、测试机器和每一项数据。

数据如何测得

帧

一帧是 1920 x 1080 网格的可见窗口,由 TsgcGridRenderer 以无窗口方式渲染到光栅画布,所用代码与绘制 VCL 和 FireMonkey 网格的代码相同。整个过程没有窗口,也没有 GPU。网格每帧都会略微滚动,就像实时网格一样。C1 和其他帧关卡取预热后 5 次运行(每次 60 帧)的中位数。

模型操作

分组、筛选、排序和汇总在网格数据模型上运行,不使用渲染器。每个数字是预热后 5 次运行的中位数,关卡有说明时则取 12 次交替运行中的最佳值。每个关卡都有预算,数字超出预算时 QA 运行即告失败。

实时更新

工作线程使用线程安全的 UpdateRow 写入价格更新,与 LiveTicker 演示的做法相同。主线程每 16.67 毫秒(60 Hz)渲染一帧。每一帧都会像已绘制的网格那样对变化的视图重新排序。基准测试会报告每秒写入的更新数、每秒渲染的帧数、错过时隙的帧数以及每帧的渲染时间。

服务器模式

TsgcGridServerProvider_DataSet 通过 FireDAC 对生成的表进行分页。每一步在其行加载完毕且帧绘制完成时结束。每个数字是预热后 5 次运行的中位数,数据库文件位于操作系统缓存中。每次运行的跳转位置相差 2,000 行,因此每次运行都从数据库读取,而不是从网格的页缓存读取。

测试机器

CPUIntel Core Ultra 5 245T,14 核,14 个逻辑处理器
内存31.5 GB
磁盘NVMe SSD,Phison 1 TB
操作系统Windows 11 Pro 26H2,版本 26300.9711
编译器Delphi 13(编译器 37.0),Win32 和 Win64 发布版本
数据库通过 FireDAC 使用 SQLite 3.42.0,嵌入并静态链接
源代码2026-11-04 的 sgcGrid 开发树(svn 修订版 20169,含本地修改)

这台机器是开发工作站,而不是独立的基准测试服务器。每次重负载运行都持有机器范围的锁,因此没有其他构建或测试同时运行。

QA 性能关卡

sgcGrid QA 套件的 perf 组,在 Win32 和 Win64 上单独运行。预算是关卡强制执行的上限(Win32 / Win64)。

关卡测量内容Win32Win64预算
C1平面帧 1920 x 1080,12 列,100,000 行1.47 毫秒1.29 毫秒4.09 / 4.32 毫秒
带样式同一帧,闪烁单元格和 3 条格式规则(60 帧平均值)1.67 毫秒1.46 毫秒25 / 16 毫秒
GW3带查找高亮的帧,100,000 行1.43 毫秒1.75 毫秒25 / 16 毫秒
GW5带 20 列、3 个带区层级、2 个冻结列的帧,100,000 行1.62 毫秒1.42 毫秒25 / 16 毫秒
GW7带图像、进度和 30 点迷你图列的帧,100,000 行2.20 毫秒3.20 毫秒25 / 16 毫秒
F1带 2 个冻结列和页脚、向两个方向滚动的帧,100,000 行0.56 毫秒0.50 毫秒25 / 16 毫秒
G4按 2 列分组、全部展开的 1,000,000 行的帧0.49 毫秒0.48 毫秒25 / 16 毫秒
D1带 3 个可见明细带(每个 50 行)的帧2.47 毫秒2.65 毫秒25 / 16 毫秒
G1按 2 列对 100,000 行分组,2 个汇总,构建并展平15.11 毫秒11.98 毫秒60 / 40 毫秒
G2按 2 列对 1,000,000 行分组,2 个汇总,构建并展平155.37 毫秒132.61 毫秒700 / 450 毫秒
G3展开或折叠 1,000,000 行视图中的一个分组4.16 毫秒3.28 毫秒25 / 15 毫秒
G5页脚汇总,100,000 行的 5 列5.64 毫秒2.34 毫秒25 / 15 毫秒
T1100,000 行的树,深度最多 8 层,完全展开时构建并展平20.42 毫秒22.80 毫秒90 / 60 毫秒
GW0重建已排序视图,1,000,000 行253.45 毫秒240.29 毫秒268.24 / 259.62 毫秒
GW1含 1,000 个成员的文本列的不同值,带级联筛选,1,000,000 行55.61 毫秒48.42 毫秒450 / 300 毫秒
GW2使用 1,000 个值中选 500 个的值列表加一个条件进行筛选,1,000,000 行50.75 毫秒48.02 毫秒225 / 150 毫秒
M1数据之上的行视图内存,按 2 列分组的 1,000,000 行20.07 MB20.09 MB32 MB
X1导出 100,000 行 x 12 列的 XLSX,2 个分组层级,含汇总1,693.87 毫秒1,002.71 毫秒4,500 / 3,000 毫秒
L2日志查看器跟随末尾,同时一个线程每秒追加 10,000 行:每秒绘制的帧数38.87 fps38.67 fps至少 20 fps
L2同一次运行:输入延迟的第 99 百分位4.22 毫秒2.83 毫秒33 毫秒

60 fps 的实时更新

sgcGridBench_Live:工作线程用 UpdateRow 写入随机一行的价格、涨跌、成交量和时间,同时主线程每 16.67 毫秒 渲染一个已排序、闪烁的 1920 x 1080 网格。每种情况 5 秒。错过的时隙是指在下一帧开始之后才完成的帧。

行数目标速率平台更新数/秒帧数/秒错过的时隙渲染中位数渲染 p99渲染最大值
1,0001,000/sWin321,00060.001.28 毫秒2.46 毫秒2.57 毫秒
1,0001,000/sWin641,00060.001.36 毫秒2.41 毫秒2.45 毫秒
1,00010,000/sWin329,99860.001.43 毫秒2.79 毫秒2.98 毫秒
1,00010,000/sWin649,99860.001.29 毫秒2.46 毫秒3.17 毫秒
1,000尽可能快Win321,552,85860.001.26 毫秒3.09 毫秒3.35 毫秒
1,000尽可能快Win642,001,92160.001.26 毫秒2.54 毫秒3.28 毫秒
100,0001,000/sWin321,00060.0010.52 毫秒13.72 毫秒15.92 毫秒
100,0001,000/sWin641,00060.0010.50 毫秒13.99 毫秒14.68 毫秒
100,00010,000/sWin329,96647.66214.70 毫秒40.33 毫秒42.03 毫秒
100,00010,000/sWin649,99754.22913.59 毫秒35.10 毫秒39.86 毫秒

100,000 行的已排序网格在排序列发生变化的每一帧都会对视图重新排序,因此其渲染时间随行数增长。对未排序列的更新会保留视图,而 MaxFPS 可以降低只需要看起来实时的网格的帧率。

1,000,000 行和 10,000,000 行的数据库表

SQLite 3.42.0 上的 sgcGridBench_Server,Win64。该表有 12 列混合类型(整数、文本、浮点数、日期时间、布尔值),一个带索引的整数键和一个带索引的客户列,数据为确定性生成。每一步都以行加载完毕且 1920 x 1080 帧绘制完成结束。预热后 5 次运行的中位数。

步骤1,000,000 行10,000,000 行数据库上运行的内容
打开到绘制出第一页2.8 毫秒117.3 毫秒来自架构的列,精确的 COUNT(*),第一页
使用估算行数打开2.1 毫秒2.1 毫秒CountMode = gscEstimated:只取第一页,页面返回满页时行数继续增长
精确行数0.2 毫秒115.6 毫秒SELECT COUNT(*)
跳转到中间40.1 毫秒378.8 毫秒中间行处的一页,LIMIT 和 OFFSET
跳转到末尾75.0 毫秒735.4 毫秒最后一页,LIMIT 和 OFFSET
按带索引的列排序2.5 毫秒119.3 毫秒通过其索引执行 ORDER BY customer,外加新查询的精确行数
按无索引的列排序106.9 毫秒1,169.3 毫秒ORDER BY amount DESC,全表扫描
筛选生成器条件97.5 毫秒975.7 毫秒WHERE region = 'North' AND qty > 50,行数和第一页(分别匹配 40,000 行和 400,000 行)
服务器分组,绘制分组行266.5 毫秒3,917.8 毫秒GROUP BY region(12 个分组)并给出每组的行数,全表扫描
运行后的进程内存76.5 MB75.7 MB基准测试进程的工作集,包含 SQLite 页缓存

网格本身只读取屏幕上的页,因此它自身的开销保持不变。随表增长的是数据库的工作:精确行数、深度跳转的 OFFSET,以及对无索引的列进行排序或分组。在排序或分组的列上建立索引,或使用估算行数,可以让这些步骤保持很短。生成 10,000,000 行的表用了 42.5 s,对同一文件的第二次运行得到的数据与上述数字相差在 25% 以内。

SQL Server、PostgreSQL、Firebird 以及 100,000,000 行的表将使用同样的测试工具测量。运行后,它们的数据会添加到这里。在此之前,不会公布它们的任何数字。

在您的机器和数据库上测量

基准测试程序位于 sgcUI 源代码的 QA 文件夹,QA\Grid\Bench。它们是控制台程序,没有 IDE 工程。

构建

build_bench.bat 使用 Delphi 13 为 Win32 和 Win64 构建 sgcGridBench_Server.exe 和 sgcGridBench_Live.exe,输出到 bin\win32 和 bin\win64,并把 ini 文件复制到它们旁边。

服务器模式

sgcGridBench_Server.exe --rows=10000000 在表不存在时创建该表,然后测量每一步,并写出一份 Markdown 报告和每个数据一行的 CSV。选项:--ini、--rows、--runs、--db、--generate、--out。

其他数据库引擎

编辑 sgcGridBench_Server.ini:DriverName 是 FireDAC 驱动(MSSQL、PG、FB 或 SQLite),[Params] 中的每个键都会传给连接,Dialect 选择 SQL 方言。ini 中为每种引擎提供了一个示例。

实时更新和 QA 关卡

sgcGridBench_Live.exe --seconds=5 运行上面的实时用例。客户端关卡是 QA 套件的 perf 组,即 sgcGridQA.exe --group=perf,它会把每个数据追加到 sgcGridQA_perf.txt。请在空闲的机器上单独运行。

[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
超值之选:All-AccesseSeGeCe 全部产品,含高级支持,每年 €1,059 起。
查看 All-Access 价格

用您的数据试用 sgcGrid

下载 sgcUI 试用版,打开 ServerModeAndCards 和 LiveTicker 演示,然后把基准测试指向您自己的数据库。