Help us shape the future of Go! Take the 2026 Go Developer Survey

ofd-performance

command module
v0.0.0-...-19c2b70 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 31, 2026 License: Apache-2.0 Imports: 21 Imported by: 0

README

ofd-performance

测量 zc310/ofd 不同版本的处理耗时、峰值内存和输出大小, 使用固定样本和字体,长期保存原始 JSON,并发布交互式性能趋势页面。

本项目关注 OFD 自身的版本变化;多种 OFD 库的转换能力与还原度对比见 ofd-benchmark。

手动指定版本

在仓库的 Actions → Performance → Run workflow 中填写 ofd_ref:

输入 被测源码
main(默认) 执行时解析出的 main 提交
v0.1.6 对应标签
完整 commit SHA 精确指定的提交

也可以使用 GitHub CLI,例如:

gh workflow run performance.yml --repo zc310/ofd-performance -f ofd_ref=main

测量工作流仅通过 workflow_dispatch 手动触发。测试成功后自动保存历史、更新 Pages。 每次记录包含请求的 ofd_ref、最终 OFD 完整 SHA、测量工具 SHA、实际依赖、 Go 构建信息、样本和字体哈希、CPU/系统及各次原始数值。 分支和标签可能移动,复现时使用结果里的完整 SHA。

测量程序依赖 pkg/converter 和 pkg/reader 当前提供的接口。 较早版本如果缺少这些 API,构建会失败;测量该版本需选择与它兼容的测量工具提交。 构建失败的版本不会产生成功历史。

测量方法

使用 Linux amd64、Ubuntu 24.04、Go stable、CGO_ENABLED=1、GOAMD64=v1, GOMAXPROCS=1、GOGC=100、GOMEMLIMIT=off。测试顺序执行。 每次记录实际 Go 版本,Go 升级后进入独立环境组。

六份样本及其来源提交、SHA-256 和预期页数固定在 scripts/ci.json:

样本 页数
testdata/ofdrw/zsbk.ofd 2
testdata/ofdrw/intro.ofd 42
testdata/ofd-creator/1000-pages.ofd 1000
testdata/ofdrw/y.ofd 3
testdata/standards/GBT_33190-2016.pdf 132
testdata/standards/GBT_42133-2022.pdf 14

OFD 样本测试四项:打开文档、打开并生成首页 PNG、整份文档转 PDF、提取全文。 PDF 样本测试 PDF 转 OFD。打开文档使用 reader.Open;PNG、PDF、文字及 PDF→OFD 均直接调用 converter 包。 首页 PNG 使用 converter.Convert 和 Page(1),150 DPI、白色背景,当前编码器压缩级别为 7; PDF 使用 150 DPI、白色背景、默认压缩和字体子集, 关闭页面并行渲染。文字提取使用默认接口,不启用 OCR。

每项先预跑一次并保存输出,再启动 10 个独立进程正式测量,共 180 条记录。 API 耗时包含输入读取、解析、相应处理和资源关闭,不含编译、进程启动、结果检查及产物落盘。 进程完整耗时另记为 process_ms。没有清空操作系统文件缓存,结果不代表磁盘冷读。 耗时展示中位数和范围;内存展示独立进程的最大峰值 RSS,包含 Go 运行时、初始化、结果检查及输出缓冲, 不是累计内存分配量。PDF/TXT 输出写入内存缓冲。

回退字体为 Google Fonts 固定提交中的 Noto Sans SC 可变字体,下载时核对 Git blob 和文件大小。 字体许可链接也在配置中。子进程排除用户字体,保留系统字体目录和指定字体; 全部系统字体清单及 SHA-256 会写入结果。与原有本机历史中的静态 Noto 字体分别比较。

保存前检查测量口径、样本哈希、18 个测试项目及每项次数、非空输出、PNG 尺寸、PDF/OFD 页数、 UTF-8 文字和千页样本的首尾页码。预跑的 PNG 在计时结束后完整解码检查。 不完整或校验失败的结果不会进入成功历史。 这些检查用于发现遗漏输出,外观质量另用渲染回归验证。

本地构建与测量

需要 Linux、Go、Python 3.11+;输出检查另需 Poppler 的 pdfinfo。 在本项目根目录运行:

python3 scripts/build.py --ofd-dir ../ofd --output /tmp/ofd-performance

构建脚本在临时目录生成 Go workspace,将本项目和指定 OFD 源码加入 use。 它同时导入 OFD 已有 workspace 中的模块,因此现有本地 canvas 仍会生效。 也可以显式提供 --canvas-dir ../third_party/canvas。 临时 workspace 随构建结束清理,源码目录的 workspace 不被改写。 go.mod 中的 OFD 默认版本仅用于模块声明,构建脚本实际使用 --ofd-dir 指定的源码。

二进制旁的 *.build.json 保存实际模块、源码 SHA、未提交状态及差异哈希。 本地可以构建工作区中的改动;CI 历史只接受干净源码。

准备固定样本与 CI 字体,然后运行测量(结果目录必须尚不存在):

python3 scripts/history.py prepare --font /tmp/ofd-font.ttf

GOMAXPROCS=1 GOGC=100 GOMEMLIMIT=off /tmp/ofd-performance \
  -font /tmp/ofd-font.ttf -repeat 10 -out /tmp/ofd-performance-results

也可用自己的中文 TTF/OTF 替换字体路径。输入路径相对当前工作目录,因此测量在本项目根目录执行。 results.json 保存原始数值;*.ofd.png、*.ofd.pdf、*.ofd.text 是预跑产物。 -system-fonts-only=false 可用于观察完整用户字体环境。 本地仅构建或运行下面的测试,不会启动性能测量。

历史数据与趋势页面

Performance 工作流使用单独的只读任务构建和测量,再由具有 contents: write 的保存任务 将 JSON 提交到本仓库的 benchmark-data 分支。每次记录的文件名包含运行 ID、重跑次数和 OFD SHA, 拒绝覆盖已有记录;并发推送冲突会在拉取和重放后重试。 原始 JSON 长期保存,Actions artifact 另保留 30 天的结果和预跑产物。

Pages 工作流在 Performance 成功完成后发布,也可以单独手动运行。 站点地址为 https://zc310.github.io/ofd-performance/。 首次启用时,在仓库 Settings → Pages → Source 选择 GitHub Actions。 历史分支尚不存在时,页面显示等待首次成功测量。

页面支持选择操作和耗时、峰值内存、输出大小,并展示请求版本、OFD 提交、测量工具提交、 Actions 运行及原始 JSON。Go 版本可以单独筛选,不会拆分环境组。只连接相同环境组的结果; 分组包含 CPU、可用 CPU 数、GC/内存限制、系统及内核、字体、重复次数等运行条件。 测量口径或样本集合变化不会拆分环境组; 某次记录缺少的样本在趋势中显示为空点。 OFD 源码和依赖版本是比较对象,保存在元数据中。 GitHub 托管机器仍有频率和共享资源波动,连续多次结果更有参考价值。 修改计时范围、预跑策略或操作参数时,同时递增 main.go 和 scripts/ci.json 的 method。 当前测量口径为 ofd-process-v2,各项转换均直接使用 converter。

验证与本地预览

python3 scripts/build.py --ofd-dir ../ofd --test --output /tmp/ofd-performance
PYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover -s scripts -p 'test_*.py'
node --test web/model.test.mjs
node --check web/app.mjs
actionlint .github/workflows/performance.yml .github/workflows/pages.yml

python3 scripts/history.py site --history /tmp/ofd-history --output /tmp/ofd-performance-site
python3 -m http.server 8000 --directory /tmp/ofd-performance-site

打开 http://localhost:8000/。/tmp/ofd-history/history/ 可放历史分支的 JSON,目录不存在时生成空历史页面。 要先看有曲线的显示效果,可以生成合成演示数据:

python3 scripts/demo.py --output /tmp/ofd-performance-demo
python3 -m http.server 8000 --directory /tmp/ofd-performance-demo

演示包含两个环境、18 次版本记录和全部操作,页面会显示演示标识;演示记录不能写入正式历史分支。 Python 测试在安装了 google-chrome 时还会验证真实浏览器渲染;未安装时跳过浏览器部分。 Git 保存测试只使用临时本地仓库。

测量程序成功退出 0,参数或运行错误退出 1,标准 flag 解析错误退出 2。 Python 工具成功退出 0,下载、构建、校验或 Git 操作失败时退出非零。

目录

main.go                        Linux 测量程序
scripts/build.py               在临时 workspace 构建指定 OFD 源码
scripts/ci.json                固定输入和测量口径
scripts/history.py             准备输入、收集结果、保存历史和生成站点
scripts/test_*.py              数据、构建、Git 并发保存及浏览器测试
web/                           静态趋势页面及页面模型测试
.github/workflows/performance.yml  手动选择 OFD 版本并测量
.github/workflows/pages.yml        发布趋势页面

Documentation

Overview

本程序测量指定 OFD 库的性能,产物写入调用方指定的临时目录。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL