ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

如何在本地用 CodSpeed 复现 RustPython 的 CI 基准测试?

如何在本地用 CodSpeed 复现 RustPython 的 CI 基准测试? 如何在本地用 CodSpeed 复现 RustPython 的 CI 基准测试【免费下载链接】RustPythonA Python Interpreter written in Rust项目地址: https://gitcode.com/GitHub_Trending/ru/RustPythonRustPython 的基准测试位于benches/目录在每一次 pull request 上都会由 CodSpeed 运行其测量方式是 CPU simulationCPU 模拟而不是墙钟时间。想在本地得到与 CI 同类的测量结果而不是普通的cargo bench计时需要安装 CodSpeed 的工具链并按 CI 的方式驱动基准。这篇文章给出本地复现的完整路径安装哪些组件、执行哪两条命令、CodSpeed 模式下基准行为与本地模式有何不同以及如何核对测量环境的一致性。准备Rust 工具链与 CodSpeed 组件RustPython 的工具链由 rust-toolchain.toml 固定为channel stable本地复现时请使用 stable 工具链。除此之外需要额外安装两个组件cargo-codspeed提供cargo codspeed子命令的 Cargo 工具CodSpeed CLI提供codspeed run命令的独立命令行工具。安装完成前可以先确认基准侧的依赖状态在 Cargo.toml 中criterion已被别名为codspeed-criterion-compatworkspace 依赖声明为criterion { package codspeed-criterion-compat, version 5.0.1, features [html_reports] }。这意味着普通的cargo bench无需任何改动兼容层只会在 CodSpeed runner 驱动基准时接管。macOS 上需要先配置.cargo/config在 macOS 上跑基准前需要在.cargo/config文件中加入以下链接参数见 benches/README.md[target.x86_64-apple-darwin] rustflags [ -C, link-arg-undefined, -C, link-argdynamic_lookup, ]其他平台无需此步骤。执行本地 CodSpeed 基准在仓库根目录依次执行cargo codspeed build -p rustpython -p rustpython-sre_engine codspeed run --mode simulation -- cargo codspeed run -p rustpython -p rustpython-sre_engine第一条命令构建参与测量的两个包rustpython与rustpython-sre_engine第二条以--mode simulation模式运行基准与 CI 中 CodSpeed 的测量方式一致。如何确认基准确实跑在 CodSpeed 兼容层下在 CodSpeed 驱动时有两个与本地模式可区分的可见行为均来自 benches/README.mdCPython 对比基准被跳过。这些基准用于本地将 RustPython 与 CPython 对比而 CodSpeed 跟踪的是 RustPython 自身的演进运行它们会使本就缓慢的 instrumented run 时间翻倍因此 CI 与本地 CodSpeed 模式下都不运行使用ITERATIONS的微基准只跑单个取值。普通模式下引用了ITERATIONS的微基准会以 100 到 1,000 之间的五个值各运行一次而 criterion 基准 id 不包含迭代次数五个规模会报告在同一个名字下所以 CodSpeed 模式只取单个值。如果你的运行中看到了 CPython 对比结果说明兼容层没有接管执行方式有问题。可选分支需要 CPython 对比时退出 CodSpeed 模式CodSpeed 模式会跳过 CPython 对比基准。如果本次目的正是对比 CPython改用仓库自带的普通基准入口即可并可指定要对比的 Python 版本benches/README.md 给出的示例PYTHON_SYS_EXECUTABLEpython3.13 cargo bench普通cargo bench完成后结果报告位于target/criterion/report/index.html。也可以用名字匹配只跑子集例如cargo bench sorted只运行名称匹配的基准。这两条路径的测量方式是墙钟时间与 CodSpeed 的模拟计数不可直接混比不要放在同一条对比链里。用环境脚本核对测量机器的一致性CodSpeed 的模拟测量不随机器快慢变化但会随“机器让进程执行什么”而变glibc 按 CPU flags 通过 IFUNC 选择memcpy、memset与字符串例程的指令流rustc 版本变化会产生不同代码链接的 CPython 版本也会影响结果。为此仓库提供了 scripts/codspeed-environment.py用于记录一台机器的基准环境并判断另一台机器是否与之一致。它的 docstring 明确给出的用法是codspeed-environment.py --record build/codspeed-environment.json codspeed-environment.py --record CURRENT --reference REFERENCE --github-output在本地可以这样用脚本为 Python 3 脚本--github-output仅在有GITHUB_OUTPUT环境变量的 CI 中才有意义本地核对时不需要python3 scripts/codspeed-environment.py --record build/codspeed-environment.json python3 scripts/codspeed-environment.py --reference build/codspeed-environment.json第一步把当前机器的环境写成 JSON并在终端打印各字段文档示例输出字段随你的机器不同而不同Benchmark environment: os 发行版与版本 arch 机器架构 ... digest 16 位十六进制摘要第二步读取 JSON 并与当前机器逐项比较。脚本的判定输出有两种均摘自脚本源码中的实际打印语句一致时打印This machine matches the reference (digest).不一致时打印This machine is not the one the reference was taken on (旧digest - 新digest):并逐行列出发生变化的字段如cpu_flags: 减少的flags - 新增的flags。比较覆盖的字段为os、arch、cpu_vendor_id、cpu_brand、cpu_cores、total_memory_gb、cpu_flags、rustc、libc、python基准旁边被测的 Python 解释器。注意脚本无论是否匹配都以 0 退出判定结论在match输出中由调用方决定不一致的代价。CI 的规则是main分支定义环境基准任何在其他 ref 上的运行只有在与 main 的记录一致时才进行测量否则跳过而不是上传——因为跨环境的上传会被发布成分支的“性能回退”。当 CodSpeed 报告出现 different runtime environments detected 时说明两次运行不在同一类机器上报告中的数字不构成两次代码树的对比此时应先用上面的脚本核对双方环境的差异字段。局限与边界本地 CodSpeed 运行与 CI 一样是模拟计数结果不随你的机器快慢变化但依赖 CPU flags、工具链和链接的 CPython 版本环境脚本的 CPU 探测目前区分 Linux读/proc/cpuinfo与 Darwin走sysctl在 docstring 和实现中只覆盖这两类平台微基准文件放在microbenchmarks/普通基准文件放在benches/benchmarks/新增文件会自动被纳入每个文件分别测“解析为 AST 的时间”与“执行时间”。如果你要新增基准规则见 benches/README.md 的 “Adding a benchmark” 与 “Adding a micro benchmark” 两节微基准用# ---分隔 setup 与待测代码两段。【免费下载链接】RustPythonA Python Interpreter written in Rust项目地址: https://gitcode.com/GitHub_Trending/ru/RustPython创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表