Skip to content

原生 UI 性能 ​

这些测量涵盖用 ui.Tester 在 CPU 上渲染的稳定帧。数据于 2026 年 10 月 8 日在 Apple M5、macOS arm64、Go 1.27.1 上采集,环境为 CGO_ENABLED=0 GOMAXPROCS=1。每个计时是视图预热后六个连续 300 ms 采样的中位数。

测试场景每帧耗时每帧分配次数每帧分配字节
1,000 个静态标签397 µs00
百万行列表的可见行14.5 µs20176
无变化的 diff 视图389 µs272
50 KB 的 Markdown 回复,整体显示1.3 ms35315,894
同一回复流式显示,每帧 16 字节0.8 ms35035,946

Markdown 行(ui/markdown 的 BenchmarkViewSteady 和 BenchmarkViewStream)于 2026 年 10 月 14 日在更繁忙的机器上采集; 解析器自身的开销参见 Markdown。

元素 handle 校验其所有者、arena 槽位和构建代际。静态标签的 handle 不 分配内存。输入绑定、动作队列和持久标识绑定在预热后复用存储。组合控件 可能分配回调闭包;这些测试场景并未覆盖所有控件和交互。

标签和列表测试场景使用公开 API。diff 测试场景使用私有渲染器 API, 测量其稳定帧的分配下限。

常驻内存 ​

一个包含 1,000 个标签的预热视图大约常驻 2.50 MB 的 Go 堆,基于 三次采样测得。测量流程为:预热字体和渲染,释放一个预热过的视图,强制 回收,然后在十帧之后和再一次回收之后测量第二个常驻视图。

这包含了无头渲染宿主。它不测量原生窗口的进程内存或 GPU 资源。

测量范围 ​

计时取决于机器、渲染后端、内容和其他进程的活动。较小的计时差异应在 多台机器上复核;分配次数则更稳定。这些结果描述的是稳定帧,并不将 MyGo 与其他 GUI 框架对比。

运行基准测试场景 ​

在 MyGo 仓库根目录:

sh
CGO_ENABLED=0 GOMAXPROCS=1 go test ./ui -run '^$' \
  -bench '^(BenchmarkValueFrame|BenchmarkValueList|BenchmarkDiffSteady)$' \
  -benchmem -count=6 -benchtime=300ms
CGO_ENABLED=0 GOMAXPROCS=1 go test ./ui/markdown -run '^$' \
  -bench '^BenchmarkView' -benchmem -count=6 -benchtime=300ms
CGO_ENABLED=0 GOMAXPROCS=1 go test ./ui \
  -run '^TestValueFrameRetainedHeap$' -count=3 -v

确保编译和其他测试不在计时运行内进行。