快速开始


什么是Bencher?

Bencher是一套持续型的性能基准测试工具。 你是否曾经因为性能回归影响到了你的用户? Bencher可以防止这种情况的发生。 Bencher让你有能力在性能回归进入生产环境 之前 就进行检测和预防。

  • 运行: 使用你喜爱的基准测试工具在本地或CI中执行你的基准测试。bencher CLI简单地包装了你现有的基准测验设备并存储其结果。
  • 追踪: 追踪你的基准测试结果的趋势。根据源分支、测试床和度量,使用Bencher web控制台来监视、查询和绘制结果图表。
  • 捕获: 在CI中捕获性能回归。Bencher使用最先进的、可定制的分析技术在它们进入生产环境之前就检测到性能回归。

基于防止功能回归的原因,在CI中运行单元测试,我们也应该使用Bencher在CI中运行基准测试以防止性能回归。性能问题就是错误!


安装 bencher 命令行工具

Linux,Mac,& Unix

对于 Linux,Mac 和其他 Unix 类操作系统,请在你的终端运行以下命令:

Terminal window
curl --proto '=https' --tlsv1.2 -sSfL https://bencher.dev/download/install-cli.sh | sh

Windows

对于 Windows 操作系统,打开 PowerShell 终端,然后运行以下命令:

Terminal window
irm https://bencher.dev/download/install-cli.ps1 | iex

🐰 如果你遇到一个错误,显示 running scripts is disabled on this system(此系统上已禁止运行脚本):

  • 管理员身份运行 Powershell
  • 运行:Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
  • 输入:Y
  • 重新运行此脚本

更多安装选项,请查看如何安装 bencher 命令行工具

现在,让我们测试一下我们是否已经安装了 bencher 命令行工具。

运行:bencher --version

你应该会看到:

$ bencher --version
bencher 0.3.26

创建一个Bencher Cloud账户

Bencher是开源的,可以自行托管。 如果你对自行托管感兴趣,请查看 Bencher Docker教程。 不过在本教程中,我们将使用Bencher Cloud。

注册Bencher Cloud


一旦你创建了一个帐户,你需要确认你的邮箱地址。 查看你的邮箱中的确认链接。 然后,你应该可以登录到Bencher Cloud。


创建 API 令牌

如果要使用 Bencher API,您需要创建一个 API 令牌。 导航至 Bencher 控制台。 将鼠标悬停在右上角的您的名字上。 应该会出现一个下拉菜单。选择令牌。 在 API 令牌页面,点击➕ 添加按钮。

添加 API 令牌


一旦您创建了新的 API 令牌,您需要将它复制到剪贴板。 在您打算工作的终端中,将 API 令牌导入为环境变量。

在 Linux、Mac 和其他类 Unix 系统上运行:export BENCHER_API_TOKEN=YOUR_TOKEN

在 Windows 上运行:$env:BENCHER_API_TOKEN = "YOUR_TOKEN"

然后运行 echo $BENCHER_API_TOKENWrite-Output $env:BENCHER_API_TOKEN

你应该会看到:

$ echo $BENCHER_API_TOKEN
YOUR_TOKEN

🐰 注意:如果你转到另一个终端,你将需要再次导出 API 令牌。


创建一个项目

现在我们有了用户帐户和API令牌,我们可以创建一个项目。 首先,我们需要知道我们新项目将属于哪个组织。

运行:bencher org list

你应该看到类似以下的东西:

$ bencher org list
[
{
"name": "Saul Goodman",
"slug": "saul-goodman",
"uuid": "4581feb0-6cac-40a9-bd8a-d7865183b01e"
"created": "2022-07-06T11:24:36Z",
"modified": "2022-07-06T11:24:36Z"
}
]

你的输出应比以上略有不同:

  • uuid 是伪随机的
  • nameslug 将基于你的用户名
  • createdmodified 时间戳应该是你刚注册的时间

我们现在可以在你的组织中创建一个新项目。 将你的组织slug替换到下方命令的 organization 参数 (例如 YOUR_ORG_SLUG)。

运行:bencher project create YOUR_ORG_SLUG --name "Save Walter White" --url http://www.savewalterwhite.com

你应该看到类似以下的东西:

$ bencher project create saul-goodman --name "Save Walter White" --url http://www.savewalterwhite.com
{
"organization": "4581feb0-6cac-40a9-bd8a-d7865183b01e",
"name": "Save Walter White",
"slug": "save-walter-white-1234abcd",
"uuid": "c6c2a8e8-685e-4413-9a19-5b79053a71b1"
"url": "http://www.savewalterwhite.com",
"public": true,
"created": "2022-07-06T11:36:24Z",
"modified": "2022-07-06T11:36:24Z"
}

同样,你的输出应该和以上稍有不同。 只需确保这个命令能正常运行。 记下Project slug 字段 (例如 save-walter-white-1234abcd)。


运行一个报告

我们终于可以开始收集一些基准度量数据了! 为了简单起见,我们在本教程中将使用模拟数据。

运行:bencher mock

你应该看到类似以下的东西:

$ bencher mock
{
"bencher::mock_0": {
"latency": {
"value": 3.7865423396154463,
"lower_value": 3.4078881056539014,
"upper_value": 4.165196573576991
}
},
"bencher::mock_1": {
"latency": {
"value": 16.398332128878437,
"lower_value": 14.758498915990593,
"upper_value": 18.03816534176628
}
},
"bencher::mock_2": {
"latency": {
"value": 20.88091359871672,
"lower_value": 18.792822238845048,
"upper_value": 22.969004958588393
}
},
"bencher::mock_3": {
"latency": {
"value": 33.88103801203782,
"lower_value": 30.492934210834036,
"upper_value": 37.2691418132416
}
},
"bencher::mock_4": {
"latency": {
"value": 40.90515638867921,
"lower_value": 36.81464074981129,
"upper_value": 44.99567202754713
}
}
}

你的输出应该和以上稍有不同,因为数据是伪随机的。 只需这个命令能正常运行。


现在让我们使用模拟的基准度量数据运行一个报告。 将你的项目 slug替换到下方命令的 --project 参数 (例如YOUR_PROJECT_SLUG)。

运行:bencher run --project YOUR_PROJECT_SLUG "bencher mock"

你应该看到类似以下的东西:

$ bencher run save-walter-white-1234abcd "bencher mock"
{
"bencher::mock_0": {
"latency": {
"value": 0.15496641529475275,
"lower_value": 0.13946977376527747,
"upper_value": 0.17046305682422802
}
},
"bencher::mock_1": {
"latency": {
"value": 18.648298578180437,
"lower_value": 16.783468720362393,
"upper_value": 20.513128435998482
}
},
"bencher::mock_2": {
"latency": {
"value": 28.20328182167366,
"lower_value": 25.382953639506294,
"upper_value": 31.023610003841025
}
},
"bencher::mock_3": {
"latency": {
"value": 34.45732560787596,
"lower_value": 31.01159304708836,
"upper_value": 37.903058168663556
}
},
"bencher::mock_4": {
"latency": {
"value": 44.9237520767597,
"lower_value": 40.43137686908373,
"upper_value": 49.41612728443567
}
}
}
{
"branch": "master",
"end_time": "2023-07-18T14:21:27.796871Z",
"results": [
"{\n \"bencher::mock_0\": {\n \"latency\": {\n \"value\": 0.15496641529475275,\n \"lower_value\": 0.13946977376527747,\n \"upper_value\": 0.17046305682422802\n }\n },\n \"bencher::mock_1\": {\n \"latency\": {\n \"value\": 18.648298578180437,\n \"lower_value\": 16.783468720362393,\n \"upper_value\": 20.513128435998482\n }\n },\n \"bencher::mock_2\": {\n \"latency\": {\n \"value\": 28.20328182167366,\n \"lower_value\": 25.382953639506294,\n \"upper_value\": 31.023610003841025\n }\n },\n \"bencher::mock_3\": {\n \"latency\": {\n \"value\": 34.45732560787596,\n \"lower_value\": 31.01159304708836,\n \"upper_value\": 37.903058168663556\n }\n },\n \"bencher::mock_4\": {\n \"latency\": {\n \"value\": 44.9237520767597,\n \"lower_value\": 40.43137686908373,\n \"upper_value\": 49.41612728443567\n }\n }\n}\n"
],
"settings": {},
"start_time": "2023-07-18T14:21:27.773930Z",
"testbed": "base"
}
{
"uuid": "5554a92c-6f5c-481d-bd47-990f0a9bac6d",
"user": { ... },
"project": { ... },
"branch": { ... },
"testbed": { ...},
"start_time": "2023-07-18T14:21:27Z",
"end_time": "2023-07-18T14:21:27Z",
"adapter": "magic",
"results": [
[
{
"measure": { ... },
"threshold": null,
"benchmarks": [ ... ]
}
]
],
"alerts": [],
"created": "2023-07-18T14:21:27Z"
}
View results:
- bencher::mock_0: https://bencher.dev/console/projects/save-walter-white-1234abcd/perf?measures=4358146b-b647-4869-9d24-bd22bb0c49b5&branches=95521eff-09fa-4c02-abe1-dd824108869d&testbeds=5b4a6f3e-a27d-4cc3-a2ce-851dc6421e6e&benchmarks=88375e7c-f1e0-4cbb-bde1-bdb7773022ae
- bencher::mock_1: https://bencher.dev/console/projects/save-walter-white-1234abcd/perf?measures=4358146b-b647-4869-9d24-bd22bb0c49b5&branches=95521eff-09fa-4c02-abe1-dd824108869d&testbeds=5b4a6f3e-a27d-4cc3-a2ce-851dc6421e6e&benchmarks=e81c7863-cc4b-4e22-b507-c1e238871137
- bencher::mock_2: https://bencher.dev/console/projects/save-walter-white-1234abcd/perf?measures=4358146b-b647-4869-9d24-bd22bb0c49b5&branches=95521eff-09fa-4c02-abe1-dd824108869d&testbeds=5b4a6f3e-a27d-4cc3-a2ce-851dc6421e6e&benchmarks=31dede44-d23a-4baf-b639-63f2ac742e42
- bencher::mock_3: https://bencher.dev/console/projects/save-walter-white-1234abcd/perf?measures=4358146b-b647-4869-9d24-bd22bb0c49b5&branches=95521eff-09fa-4c02-abe1-dd824108869d&testbeds=5b4a6f3e-a27d-4cc3-a2ce-851dc6421e6e&benchmarks=c7e32369-f3dd-473d-99a3-6289ae32b38e
- bencher::mock_4: https://bencher.dev/console/projects/save-walter-white-1234abcd/perf?measures=4358146b-b647-4869-9d24-bd22bb0c49b5&branches=95521eff-09fa-4c02-abe1-dd824108869d&testbeds=5b4a6f3e-a27d-4cc3-a2ce-851dc6421e6e&benchmarks=779bc477-4964-4bae-aa8c-4da3e388822c

你现在可以在浏览器中查看每个基准测试的结果。 点击或复制并粘贴 View results 的链接。 现在每个基准测试应该只有一项数据,让我们添加更多数据!


首先,让我们将项目slug设置为环境变量,这样我们就不需要在每次运行命令时提供 --project

运行:export BENCHER_PROJECT=save-walter-white-1234abcd

然后运行:echo $BENCHER_PROJECT

你应该看到:

$ echo $BENCHER_PROJECT
save-walter-white-1234abcd

我们再次运行同样的命令(不使用 --project)来生成更多数据。

运行:bencher run "bencher mock"


现在,让我们生成更多的数据,但这次我们将结果传给 bencher run

运行:bencher mock | bencher run


有时你可能想将你的结果保存到一个文件中,并让 bencher run 来读取它们。

运行:bencher run --file results.json "bencher mock > results.json"


同样地,你可能有一个独立的进程运行你的基准测试并将你的结果保存到一个文件中。然后 bencher run 将会读取它们。

运行:bencher mock > results.json && bencher run --file results.json


最后,让我们通过 bencher run--iter 参数生成大量的数据。

运行:bencher run --iter 16 "bencher mock"


🐰 提示:查看 bencher run CLI子命令文档以获取全面了解bencher run能干什么!


生成一个警报

现在我们的基准测试有了一些历史数据,让我们生成一个警报! 警报是当基准结果被确定为性能退化时生成的。 所以让我们模拟一个性能退化!

运行:bencher run "bencher mock --pow 8"


在输出的最后部分应该有一个新的区域,叫作 View alerts

View alerts:
- bencher::mock_0: https://bencher.dev/console/projects/save-walter-white-1234abcd/alerts/b2329d5a-4471-48ab-bfbd-959d46ba1aa6
- bencher::mock_1: https://bencher.dev/console/projects/save-walter-white-1234abcd/alerts/181b1cf5-d984-402a-b0f1-68f6f119fa66
- bencher::mock_2: https://bencher.dev/console/projects/save-walter-white-1234abcd/alerts/b9b6c904-c657-4908-97db-dbeca40f8782
- bencher::mock_3: https://bencher.dev/console/projects/save-walter-white-1234abcd/alerts/5567ff32-2829-4b6a-969a-af33ce3828db
- bencher::mock_4: https://bencher.dev/console/projects/save-walter-white-1234abcd/alerts/49f2768f-ccda-4933-8e1d-08948f57a74d

你现在可以在浏览器中查看每个基准测试的警报。 点击或复制并粘贴 View alerts 的链接。


🐰 提示:查看 阈值和警报文档以全面了解如何检测性能退化!



🐰 恭喜!你捕捉到了你的第一个性能退化! 🎉


继续下去:基准测试概览 ➡

🤖 该文档由 OpenAI GPT-4 自动生成。 它可能不准确并且可能包含错误。 如果您发现任何错误,请在 GitHub 上提出问题.


Published: Fri, October 27, 2023 at 8:40:00 AM UTC | Last Updated: Wed, March 27, 2024 at 7:50:00 AM UTC