图形学【免费下载链接】skiaSkia is a complete 2D graphic library for drawing Text, Geometries, and Images. See documentation for contribution instructions.项目地址https://gitcode.com/gh_mirrors/ski/skia点击查看免费下载nanobench是 Skia 官方提供的性能基准测试benchmark工具用于测量 GM、micro-bench、SKP 回放、SVG 渲染、图片解码等各类工作负载的执行耗时。本文以仓库内 nanobench 使用文档 为主体脉络结合 nanobench 源码、目标抽象层、JSON 结果写入器 与 GN 构建参数文档系统讲解如何构建 Release 版 nanobench、使用--match等过滤参数精准定位基准、通过nanobench_control建立可复现的性能基线并解读其自动校准 loops 与计时精度的底层原理。读完本文你将能够独立完成一次从改动前基线采集到改动后对比分析的完整 Skia 性能回归评估。nanobench 测量什么基准来源一览nanobench 的性能测试对象远比单一 benchmark 更广。从 BenchmarkStream 的实现 可以看到它依次遍历以下来源并为每个来源标记sourceType与benchType来源sourcebench 类型说明benchmicro通过BenchRegistry注册的微型基准DEF_BENCH如 bench 目录 下的各类.cppgmmicro实现了runAsBench()的 GM被包装为 GMBench 参与计时texttracemicroTextBlobTrace 回放读取--texttraces目录下的.trace文件skprecording/deserial/playback同一个.skp会被依次用作录制、反序列化和回放三类基准svgplayback通过 ReadSVGPicture 解析 SVG 并录制为SkPicture后回放mskpmskp多层 SKP 文件.mskp由MSKPBench驱动imageskcodec图片解码基准遍历--images指定的图片目录分别按 N32、RGB565、Alpha8、Gray8 等色彩类型解码因此在执行nanobench之前先明确你想测哪一类负载是纯 CPU 的微基准还是真实 SKP 的录制/回放还是编解码路径。这一点直接影响--match与--benchType的组合方式。构建 Release 版 nanobench基准测试的前提nanobench的计时数据只有在开启优化的 Release 构建下才有意义——Debug 构建带有断言与未优化代码测得的时间无法代表真实性能。因此官方文档的第一条铁律就是基准测试永远使用 Release 构建Always use a Release build for benchmarking。使用 GN 构建体系时按照 skia-gn-workflow 技能 的约定用仓库自带的./bin/gn生成构建目录并配置参数# 1. 生成 Release 构建目录is_debugfalse 即 Release ./bin/gn gen -q out/Release --argsis_debugfalse # 2. 构建 nanobench 目标 ninja --quiet -C out/Release nanobench关于构建参数与 Release 的更多细节如is_official_build、sanitizer 构建、平台参数可参考 GN 构建配置文档。需要特别注意的是如果项目中已存在构建目录切勿擅自覆盖其设置如需不同配置应新建目录如out/Release2、out/ASAN当构建需要cc/cxx/clang_win等工具链路径时务必向用户确认工具链在本机的实际位置。另外从源码可以看到main 函数 对--outResultsFile有硬性约束只有定义了SK_RELEASE的 Release 构建才允许写结果文件Debug 构建会直接打印 Im ignoring --outResultsFile because this is a Debug build. 并返回错误码 1。这是必须用 Release 构建这一要求最直接的代码级证据。基本用法与--match过滤构建完成后最基础的调用方式是out/Release/nanobench --match pattern--match别名-m是 nanobench 最常用的过滤参数按基准名称做大小写敏感的匹配。其语法比普通子串匹配更丰富flag 定义 中完整规定了如下规则语法含义示例substring名称中包含该子串即匹配--match gradient匹配所有名称含 gradient 的基准~substring排除包含该子串的名称--match ~font跳过所有含 font 的基准^substring名称必须以该子串开头--match ^Blur只匹配 Blur 开头的基准substring$名称必须以该子串结尾--match $RTree只匹配 RTree 结尾的基准^substring$完全匹配整个名称--match ^alphagradients$精确定位单个 GM多个匹配规则可用空格分隔同一规则列表内同时支持包含与排除~语义如果一个名称不匹配任何列表条目它会被跳过除非列表中存在以~开头的排除条目。这一设计让你可以灵活地做除了 A 和 B 之外全测这类组合过滤。配合--sourceType与--benchType可以进一步缩小范围flag 定义# 只看图片解码类基准 out/Release/nanobench --benchType skcodec # 只看 SKP 回放 out/Release/nanobench --benchType playback--dryRun是一个实用的辅助参数它只打印将要运行的基准与配置不实际执行执行逻辑适合在真正跑长任务前核对过滤结果是否符合预期。建立性能基线nanobench_control对比工作流要准确衡量一次代码改动带来的性能影响最好的做法是保留一份对照组二进制与改动后的新构建做同机对比。官方推荐的流程如下构建基线版本例如在out/Release中复制二进制到稳定位置脱离构建目录避免后续ninja重新生成时被覆盖cp out/Release/nanobench ./nanobench_control注意在 skia-gn-workflow 技能 中强调基线二进制应复制到out/目录之外例如仓库根目录这是防止构建产物被清理或重建的最稳妥做法应用代码改动并重新构建out/Release/nanobench分别运行并对比./nanobench_control --config 8888 --match gradient out/Release/nanobench --config 8888 --match gradient在--samples模式下nanobench 会为每个基准输出 min / median / mean / max / 标准差等统计量见下文结果解读对比两个二进制在同一基准上的 median 即可判断改动是提升还是回退。为了保证对比有效两次运行应满足同一台机器、相同的--config与--match、相同的 Release 构建选项且尽量避免后台负载干扰。常用参数详解匹配与过滤Matching / Filtering--match/-m按名称过滤基准大小写敏感语法见上文表格。--config names指定要运行的渲染配置config。默认值为8888 gl nonrendering——这一默认值并非文档杜撰而是定义在 CommonFlagsConfig.cpp 的 defaultConfigs 中CPU 光栅化8888、Ganesh GPUglAndroid/iOS 上为gles外加纯逻辑基准nonrendering。可用的 CPU 配置在 create_config 的 CPU_CONFIG 宏 中定义包括config颜色类型说明nonrendering未知不绘制仅测逻辑计算a8Alpha_88 位 alphagray8/r8Gray_8 / R8灰度 / 单通道565RGB_56516 位 RGB8888N3232 位 premul 颜色默认rgba/bgraRGBA/BGRA_888832 位f16RGBA_F16半精度浮点srgbaSRGBA_8888sRGB 编码的 8888GPU 端则可通过 gPredefinedConfigs 表 使用gl、gles、glmsaa4、glmsaa8、gldmsaa等预设配置例如--config glmsaa4表示 GL 4x MSAA。--benchType type按基准类型过滤如micro、recording、playback、skcodec、mskp等。--sourceType type按来源过滤如bench、gm、skp、image、svg。基准计时参数Benchmarking Parameters--samples n每个基准采集的样本数默认 10flag 定义。--ms n若大于 0则忽略--samples改为在每个基准上持续运行n毫秒。源码中 对应分支 会反复计时直到累计超过FLAGS_ms适合希望控制总耗时的场景。--loops n每个基准内部重复执行的次数。默认 0 表示自动调优auto-tune由工具自行决定每个基准该跑多少 loops 才能让计时器开销可忽略只有 auto-tune 模式才会报告耗时时长见 loops_help_txt。当显式指定 loops 时nanobench 会自动把--samples强制为 1、把 GPU 帧滞后--gpuFrameLag设为 0main 中的处理并且不再打印耗时因为固定 loops 下的时间不可比较。--verbose/-v开启详细输出会额外打印每个样本的原始耗时对应代码。--overheadLoops n/--overheadGoal f计时器开销估算的循环次数与开销占比目标默认100000次与0.0001flag 定义。CPU 基准的 loops 自动调优就是基于这两个参数计算出来的见下文自动校准原理。--maxLoops n单基准允许的最大 loops默认1000000超过会被 clampclamp_loops。输出与运行控制--outResultsFile file以 JSON 格式写出结果仅 Release 构建有效见上文。--csv以 CSV 格式打印状态行便于导入表格工具。--quiet/-q精简输出只打印micros与基准名并用?/!标记中/高方差实现。--dryRun只列出将运行的测试而不执行。--writePath/-w把基准绘制的画布以 PNG 形式写入指定目录按config/benchName.png组织对应代码。--threads/-j线程池额外线程数默认每核心一条额外线程。--cpu/--gpu是否运行 CPU 侧 / GPU 侧工作均默认开启。--purgeBetweenBenches在每个基准之间调用SkGraphics::PurgeAllCaches()清理缓存适合考察无缓存冷启动性能。--key k v .../--properties k v ...成对写入 JSON 的键值元数据用于标识构建信息与运行环境处理逻辑。--gpuStats每个 GPU 基准后打印 GPU 缓存与上下文统计printCacheStats/printGpuStats/printContextStats实现。性能剖析ProfilingCPU/内存剖析依赖 gperftools必须在 GN 参数中开启skia_use_pproftrue并重新构建./bin/gn gen -q out/Release --argsis_debugfalse skia_use_pproftrue ninja --quiet -C out/Release nanobench该参数在 gn/skia.gni 中默认值为false。若未开启而使用剖析参数源码会直接SK_ABORT(Must be compiled with -DSK_USE_PPROF (e.g. skia_use_pprof))对应代码。此外构建参数文档 建议在剖析构建中追加extra_cflags[-Og]以获得更精确的代码行归属该参数需要系统安装libgoogle-perftools-dev。开启后即可使用--cpuprofile file把 pprof CPU 剖析数据写入file内部调用ProfilerStart见 源码。--memprofile prefix把 pprof 堆剖析数据写入以prefix为前缀的系列文件内部调用HeapProfilerStart/HeapProfilerDump(final)见 源码运行期间会产生prefix.NNNN.heap文件。底层原理loops 自动校准与计时精度理解 nanobench 的计时机制有助于解释为什么参数是这些默认值也能帮你判断何时该手动指定--loops。CPU 基准让计时器开销可忽略对于 CPU光栅目标nanobench 先用estimate_timer_overhead()空转--overheadLoops次估算计时器开销实现然后在 setup_cpu_bench 中求解满足如下不等式的 loopsoverhead / (overhead N * bench_time) overheadGoal即选择 N 使计时器开销占总耗时的比例低于--overheadGoal默认 0.01%。自动调优还带有防呆机制如果连续--maxCalibrationAttempts默认 3次都无法让单次耗时超过计时器开销则跳过该基准并打印警告。GPU 基准目标帧时长与帧滞后GPU 基准走 setup_gpu_bench 分支先空跑一帧以编译管线warmup然后不断加倍 loops直到单次耗时达到--gpuMs默认 5ms目标再按--gpuFrameLag默认 5考虑 GPU 允许滞后的帧数确保计时的不是上一轮的残留帧。GPU 目标通过 needsFrameTiming 与submitWorkAndSyncCPU保证每帧提交与同步的语义正确。样本采集与统计正式采集阶段main 中对应代码--ms模式下持续计时直到时间耗尽--samples模式下采集固定样本数每个样本再除以bench-getUnits()换算为单单位耗时。采集到的样本经 tools/Stats.h 计算 min / median / mean / max / 标准差并支持在样本较多时输出 ASCII 分布图。结果解读控制台输出与 JSON 格式控制台输出默认非 quiet、非 csv输出形如curr/maxrss loops min median mean max stddev samples config bench各列依次为当前/峰值常驻内存MB、校准后的 loops、最小/中位/平均/最大耗时、标准差百分比、样本分布、config、基准名。--verbose下耗时以纳秒显示HUMANIZE逻辑见 nanobench.cpp便于精确对比。JSON 结果文件--outResultsFile写出的 JSON 由 NanoJSONResultsWriter 生成结构在 其注释 中有完整说明{ key: { arch: x86_64, gpu: ..., os: Linux }, gitHash: ..., results: { BenchName_640_480: { 8888: { options: { name: ... }, min_ms: 0.42, min_ratio: 1.02, samples: [ ... ], ... } } } }每个基准条目以名称_宽_高为键beginBench内层按 config 分组记录min_ms、median_ms、mean_ms、max_ms等指标指标写入代码非有限值NaN/Inf会被过滤。运行结束时还会额外追加一个memory_usage条目记录max_rss_mb对应代码。这使 nanobench 结果可以被脚本化解析也便于接入 Skia 的持续性能监控体系。示例工作流运行名称匹配 gradient 的基准out/Release/nanobench --config 8888 --match gradient --samples 5 --ms 100组合使用固定样本数5与时长上限100ms--ms模式下会忽略--samples并持续运行到 100ms适合在希望限时但又不想要固定 loops 的场景。仅测8888CPU 配置可避免 GPU 环境依赖便于在无图形环境的 CI 上复现。剖析某个具体基准# 确保 GN 参数中已开启 skia_use_pproftrue 并重新构建 out/Release/nanobench --config 8888 --match alphagradients --cpuprofile profile.pprof跑完后用 pprof 工具分析profile.pprof可定位该 GM 在光栅化路径中的热点函数。若要同时抓内存可追加--memprofile heap。定位 SKP 性能回退# 对照组改动前基线 ./nanobench_control --skps ~/skp_data --benchType playback --match myapp # 实验组改动后新构建 out/Release/nanobench --skps ~/skp_data --benchType playback --match myapp其中--skps dir指定 SKP 文件目录默认skpsflag 定义--clip可控制回放裁剪区域默认0,0,1000,1000--scales控制回放缩放比例默认1.0。对比两组 median 即可量化改动对真实场景的影响。常见注意事项与限制务必使用 Release 构建Debug 构建不仅性能失真--outResultsFile也会被直接拒绝。剖析参数必须在构建时开启skia_use_pproftrue是编译期选项运行时开启无效。固定 loops 不报耗时一旦指定--loopsnanobench 认为时间不可比而不再输出耗时只输出基准名与 config且 samples 会被强制为 1——请按需选择--loops或--samples/--ms模式。GPU 基准依赖驱动同步能力若 GL 上下文不支持 fence syncGPUTarget 会打印警告提示计时可能不准确。首次运行会预热当--ms 1000且处于 auto-tune 模式时nanobench 会把第一个基准额外跑满 1000ms 作为整体预热对应代码避免前几个基准因缓存/管线未就绪而测值偏低。如需将 nanobench 与 Skia 的构建、测试体系串联使用可进一步阅读 skia-gn-workflow 技能文档 及其 dm 用法、viewer 用法 等配套参考从而在构建 → 正确性dm→ 性能nanobench→ 可视化viewer的完整工作流中定位与验证问题。赞分享图形学【免费下载链接】skiaSkia is a complete 2D graphic library for drawing Text, Geometries, and Images. See documentation for contribution instructions.项目地址https://gitcode.com/gh_mirrors/ski/skia点击查看免费下载相关推荐Skia GN 构建工作流完全指南从 dm 正确性测试到 nanobench 性能基准与 viewer 可视化Skia GN 构建工作流完全指南从 dm 正确性测试到 nanobench 性能基准与 viewer 可视化 Skia 是基于 GN 构建系统与 Ninja图形学miniblink49 内嵌 Skia 的 Windows 构建与测试实战gyp_skia 工程生成、dm 测试与 nanobench 性能基准miniblink49 内嵌 Skia 的 Windows 构建与测试实战gyp_skia 工程生成、dm 测试与 nanobench 性能基准 本文基于 m前端桌面应用ILLA Builder构建工具性能基准测试构建时间对比ILLA Builder构建工具性能基准测试构建时间对比 企业级前端项目开发中构建耗时过长严重影响团队效率10人团队日均等待构建时间常超3小时。ILLA低代码前端应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?