外观
原生 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 µs | 0 | 0 |
| 百万行列表的可见行 | 14.5 µs | 20 | 176 |
| 无变化的 diff 视图 | 389 µs | 2 | 72 |
| 50 KB 的 Markdown 回复,整体显示 | 1.3 ms | 353 | 15,894 |
| 同一回复流式显示,每帧 16 字节 | 0.8 ms | 350 | 35,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确保编译和其他测试不在计时运行内进行。