快速开始


什么是Bencher?

Bencher是一套连续基准测试工具。 你是否曾经有性能退化影响你的用户? Bencher可以防止这种情况发生。 Bencher让你能在性能退化_进入_生产环境前就检测和防止它。

  • 运行:在本地或CI中使用你最喜欢的基准测试工具运行你的基准测试。 bencher CLI只是包装了你现有的基准测试工具,并存储其结果。
  • 追踪:跟踪你基准测试的结果。基于源分支、测试平台和度量类型,使用基于Bencher的web控制台监控、查询和图形化结果。
  • 捕获:在CI中捕获性能退化。Bencher使用最先进的、可定制的分析工具在性能退化进入生产环境前就检测到它。

出于同样的原因,单元测试在CI中运行是为了防止功能退化,基准测试应该在CI中使用Bencher运行,以防止性能退化。性能bug就是bug!


安装 bencher CLI

为了安装 bencher CLI,你需要先安装 cargo。检查你是否已经安装了 cargo

运行:cargo --version

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

$ cargo --version
cargo 1.65.0 (4bc8f24d3 2022-10-20)

如果你的版本号不同也没关系。只需确保这个命令能正常运行。 如果没有,请按照通过rustup安装 cargo的指南进行安装。

在Linux或macOS上,运行:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

安装了 cargo 后,我们就可以安装 bencher CLI了。

运行:

cargo install --git https://github.com/bencherdev/bencher --tag v0.3.18 --locked bencher_cli

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

$ cargo install --git https://github.com/bencherdev/bencher --tag 0.3.18 --locked bencher_cli
  Installing bencher_cli v0.3.18 (/workspace/bencher/services/cli)
    Updating crates.io index

    Finished release [optimized] target(s) in 0.27s
  Installing /workspace/.cargo/bin/bencher
   Installed package `bencher_cli v0.3.18 (/workspace/bencher/services/cli)` (executable `bencher`)

再次说明,如果你的输出结果不一样也没关系。只需确保这个命令能正常运行。


最后,让我们测试一下我们已经安装好了 bencher CLI。

运行:bencher --version

你应该看到:

$ bencher —version
bencher 0.3.18

创建一个Bencher Cloud账户

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

注册Bencher Cloud


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


创建一个API令牌

为了使用Bencher API,你需要创建一个API令牌。 导航到Bencher Console。 将鼠标悬停在右上角的名字上。 应该会出现一个下拉菜单。选择 Tokens。 在API Tokens页面,点击 ➕添加 按钮。

添加一个API令牌


一旦你创建了新的API令牌,你需要将它复制到剪贴板。 在你计划使用的终端中,将API令牌作为环境变量导出。

运行:export BENCHER_API_TOKEN=你的令牌

然后运行: echo $BENCHER_API_TOKEN

你应该看到:

$ echo $BENCHER_API_TOKEN
你的令牌

🐰 注意:如果你切换到其他终端,你需要再次导出API令牌。


创建一个项目

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

运行:bencher org ls

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

$ bencher org ls
[
  {
    "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替换到下方命令的 --org 参数 (例如 你的组织_slug)。

运行:bencher project create --org 你的组织_slug --url http://www.savewalterwhite.com "Save Walter White"

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

$ bencher project create --org saul-goodman --url http://www.savewalterwhite.com "Save Walter White"
{
  "organization": "4581feb0-6cac-40a9-bd8a-d7865183b01e",
  "name": "Save Walter White",
  "slug": "save-walter-white-12345",
  "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-12345)。


运行一个报告

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

运行: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 参数 (例如你的项目_slug)。

运行:bencher run --project 你的项目_slug "bencher mock"

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

$ bencher run --project save-walter-white-12345 "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": [
    [
      {
        "metric_kind": { ... },
        "threshold": null,
        "benchmarks": [ ... ]
      }
    ]
  ],
  "alerts": [],
  "created": "2023-07-18T14:21:27Z"
}

View results:
- bencher::mock_0: https://bencher.dev/console/projects/save-walter-white-12345/perf?metric_kinds=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-12345/perf?metric_kinds=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-12345/perf?metric_kinds=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-12345/perf?metric_kinds=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-12345/perf?metric_kinds=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-12345

然后运行:echo $BENCHER_PROJECT

你应该看到:

$ echo $BENCHER_PROJECT
save-walter-white-12345

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

运行:bencher run "bencher mock"


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

运行:bencher mock | bencher run


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

运行:bencher run "bencher mock > results.json" --file 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-12345/alerts/b2329d5a-4471-48ab-bfbd-959d46ba1aa6
- bencher::mock_1: https://bencher.dev/console/projects/save-walter-white-12345/alerts/181b1cf5-d984-402a-b0f1-68f6f119fa66
- bencher::mock_2: https://bencher.dev/console/projects/save-walter-white-12345/alerts/b9b6c904-c657-4908-97db-dbeca40f8782
- bencher::mock_3: https://bencher.dev/console/projects/save-walter-white-12345/alerts/5567ff32-2829-4b6a-969a-af33ce3828db
- bencher::mock_4: https://bencher.dev/console/projects/save-walter-white-12345/alerts/49f2768f-ccda-4933-8e1d-08948f57a74d

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


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



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


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

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