基准
这是独立维护的叉子 @ dapplion/ 基准。 。 。 . 这个Repo现在维持它自己的版本是:
@chainsafe/benchmark和释放时间表。 它从基地被铲出@dapplion/[email protected]并增加了新的功能.
确保新代码不引入 CI 的性能回归. 音轨 :
- 对基准分支的PR是否包含性能回归?
- 主分支的新承诺是否包含性能回归?
这种工具既便于用于制定基准,也便于整合过去的基准数据.
快开始
创建基准测试文件但使用 itBench 改为 it
import {describe, itBench, setBenchOpts} from "@chainsafe/benchmark";
describe("Sum array benchmark", () => {
itBench("sum array with reduce", () => {
arr.reduce((total, curr) => total + curr, 0);
});
});
然后运行CLI.
benchmark 'test/perf/**/*.perf.ts' --local
终端检查基准结果
Sum array benchmark
✔ sum array with reduce 826.0701 ops/s 1.210551 ms/op x0.993 578 runs 1.21 s
怎么会这样?
此工具是一个 CLI 工具, 例如使用 :
benchmark 'test/perf/**/*.perf.ts' --s3
上述命令将:
- 从指定的提供者( AWS S3) 读取基准历史
- 根据您的选项计算出预览基准( 默认为主分支的最新承诺)
- 运行基准与上一个比较
- 在流出结果时收集基准数据
- 将结果添加到基准历史,并持续到指定的提供者(AWS S3)
- 如果在CI中张贴一份PR或承诺,并附上可扩展的基准结果比较摘要
- 如果检测到性能回归, 退出 1
CI 中的音轨性能
以下是 Github 与 S3 历史提供者运行此工具的建议动作 :
name: Benchmark
# Ensure a single benchmark is run at a time
concurrency: cd-benchmark-${{ github.ref }}
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
s3:
if: always()
runs-on: ubuntu-latest
# Ensure both don't run at the same time
needs:
- local
# - ga-cache
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2-beta
- run: yarn install --frozen-lockfile
# Run benchmark with custom tooling and stores the output to a file
- name: Run performance tests
run: yarn benchmark --s3
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# S3 credentials
S3_ACCESS_KEY: ${{ secrets.S3_ACCESS_KEY }}
S3_SECRET_KEY: ${{ secrets.S3_SECRET_KEY }}
S3_REGION: ${{ secrets.S3_REGION }}
S3_BUCKET: ${{ secrets.S3_BUCKET }}
S3_ENDPOINT: ${{ secrets.S3_ENDPOINT }}
# Key prefix to separate benchmark data from multiple repositories
S3_KEY_PREFIX: ${{ github.repository }}/${{ runner.os }}
本地音轨性能
当您努力优化某个函数时, 您可能想知道您的代码是否实际上比先前的执行更快 .
要做到这一点, 您可以在本地保存一个基准历史文件, 并比照先前的代码先运行基准
git checkout master
benchmark test/perf/func.perf.ts --local
- 不与上一个比较而运行基准
- 将单一基准数据写入
./benchmark_data
然后用新代码测量性能
git checkout fix1
benchmark test/perf/func.perf.ts --local
- 从
./benchmark_data - 运行基准与预览比较
- 不写入基准数据
孤立基准文件( Node.js)
使用 --isolate 以新进程而不是默认共享进程依次运行每个文件:
benchmark 'test/perf/**/*.perf.js' --isolate --historyLocal ./benchmark_data-isolated
每个工人都继承可执行的节点、运行时旗(包括加载器和 --expose-gc),环境,和工作目录. 每个工人都有文件 下个文件只从之前的工人退出后才开始,释放出其所保留的内存和本土资源. 已完成的工人即使基准代码留下了开口的手柄也退出.
家长仍然拥有历史,综合快照,性能比较,以及单张GitHub报告. 收集失败、基准失败、坠机、工人结果缺失、中断、以及文件重复ID等 --noThrow。允许跳过的文件,但整个运行必须至少产生一个结果.
文件必须是独立的:全局和钩子不跨文件共享,以及 .only 选择每个文件都是本地的。 跨文件使用独有的基准标识 。 切换模式时,使用新鲜的本地历史路径 CI 缓存键,或 S3 前缀;共享进程和孤立的测量不是可互换的基线. 历史命名空间不会自动更改 .
配置
--isolate
在新进程中依次运行每个文件
- 类型:布尔
- 默认: 假
--defaultBranch
提供此寄存器的默认分支, 以防止从 Github 取取
- 类型:字符串
- 默认 :
--persistBranches
选择要坚持基准数据的分支
- 类型:数组
- 默认: 默认分支
--benchmarksPerBranch
限制每个分支机构的基准数目
- 类型:数量
- 默认: 无穷
--threshold
每跑新平均时间与每跑预估时间之比考虑失败. 设定为“ 无穷” 以禁用 .
- 类型:数量
- 默认: 2
--compareBranch
将新的基准数据与本分支最新可用基准进行比较
- 类型:字符串
- 默认: 默认分支
--compareCommit
将新基准数据与具体承诺的相关基准数据进行比较
- 类型:字符串
- 默认 :
--prune
当持续历史时,删除与当前 git 历史中不再存在的承诺有关的基准数据
- 类型:布尔
- 默认 :
--persist
历史上一直存在的基准数据
- 类型:布尔
- 默认 :
--noThrow
即使找到预态回归, 也干净退出
- 类型:布尔
- 默认 :
--historyLocal, (中文(简体) ), --local
坚持本地基准历史. 可以指定仅使用默认路径的布尔, 或提供路径
- 类型:字符串
- 默认:./基准 数据
--historyGaCache, (中文(简体) ), --ga-cache
Github Actions缓存中的持久性基准历史. 需要 Github 认证 。 可能只指定布尔以使用默认缓存密钥或提供自定义密钥
- 类型:字符串
- 默认: 基准 数据
--historyS3, (中文(简体) ), --s3
亚马逊S3水桶中的持久基准历史. 需要 Github 认证
- 类型:字符串
- 默认 :
路线图
比较性能
bench compare --from <branch-name | commit-hash> --to <branch-name | commit-hash>
- 检索基准历史
- 不要运行基准
- 从基准到基准的打印比较
添加更多提供者
- Github 动作缓存:由于 Github 的局限性而无效
- 提交到寄存器( gh- pages, 或数据分支)