Schnellstart


Was ist Bencher?

Bencher ist eine Suite von kontinuierlichen Benchmarking Tools. Hatten Sie jemals Performance-Einbu├čen, die Ihre Nutzer beeintr├Ąchtigt haben? Bencher h├Ątte das verhindern k├Ânnen. Bencher erlaubt Ihnen Leistungsr├╝ckg├Ąnge zu erkennen und zu verhindern, bevor sie es in die Produktion schaffen.

  • Laufen lassen: F├╝hren Sie Ihre Benchmarks lokal oder in CI mit Ihren bevorzugten Benchmarking-Tools durch. Die bencher CLI wickelt einfach Ihre bestehenden Benchmark-Harnesses und speichert deren Ergebnisse.
  • Verfolgen: Verfolgen Sie die Ergebnisse Ihrer Benchmarks im Laufe der Zeit. ├ťberwachen, abfragen und grafische Darstellung der Ergebnisse mit der Bencher-Webkonsole basierend auf dem Quellzweig, dem Testbett und der Messart.
  • Fangen: Fangen Sie Leistungsr├╝ckg├Ąnge in CI. Bencher verwendet modernste, anpassbare Analysen, um Leistungseinbr├╝che zu erkennen, bevor sie in die Produktion gelangen.

Aus den gleichen Gr├╝nden, warum Unit-Tests in CI durchgef├╝hrt werden, um Funktionsregressionen zu verhindern, sollten Benchmarks mit Bencher in CI durchgef├╝hrt werden, um Leistungseinbr├╝che zu verhindern. Performance Bug sind Bugs!


Instalieren Sie bencher CLI

Um die bencher CLI zu installieren, muss cargo installiert sein. ├ťberpr├╝fen Sie, ob Sie cargo installiert haben.

F├╝hren Sie aus: cargo --version

Sie sollten so etwas sehen:

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

Es ist in Ordnung, wenn Ihre Versionsnummer anders ist. Es ist nur wichtig, dass dieser Befehl funktioniert. Falls nicht, folgen Sie den Anweisungen zur Installation von cargo ├╝ber rustup.

Unter Linux oder macOS:

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

Mit cargo installiert, k├Ânnen wir die bencher CLI installieren.

F├╝hren Sie aus:

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

Sie sollten so etwas sehen:

$ 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`)

Auch hier ist es in Ordnung, wenn Ihre Ausgabe anders ist. Es ist nur wichtig, dass dieser Befehl funktioniert.


Schlie├člich testen wir, ob wir die bencher CLI installiert haben.

F├╝hren Sie aus: bencher --version

Sie sollten sehen:

$ bencher ÔÇöversion
bencher 0.3.18

Erstellen Sie ein Bencher Cloud Konto

Bencher ist Open-Source und selbst hostbar. Wenn Sie an Self-Hosting interessiert sind, schauen Sie sich das Bencher Docker-Tutorial an. F├╝r dieses Tutorial werden wir jedoch Bencher Cloud verwenden.

Registrieren Sie sich f├╝r Bencher Cloud


Sobald Sie ein Konto erstellt haben, m├╝ssen Sie Ihre E-Mail-Adresse best├Ątigen. ├ťberpr├╝fen Sie Ihre E-Mails auf einen Best├Ątigungslink. Danach sollten Sie bei Bencher Cloud angemeldet sein.


Erstellen Sie ein API-Token

Um die Bencher-API zu verwenden, m├╝ssen Sie ein API-Token erstellen. Navigieren Sie zur Bencher-Konsole. Fahren Sie mit der Maus ├╝ber Ihren Namen in der rechten oberen Ecke. Ein Dropdown-Men├╝ sollte erscheinen. W├Ąhlen Sie Tokens. Auf der API-Tokens Seite klicken Sie auf den Ô׼ Hinzuf├╝gen-Button.

Ein API-Token hinzuf├╝gen


Sobald Sie Ihr neues API-Token erstellt haben, m├╝ssen Sie es in Ihre Zwischenablage kopieren. Im Terminal, in dem Sie arbeiten m├Âchten, exportieren Sie das API-Token als Umgebungsvariable.

F├╝hren Sie aus: export BENCHER_API_TOKEN=IHR_TOKEN

Wenn Sie dann ausf├╝hren: echo $BENCHER_API_TOKEN

Sollten Sie sehen:

$ echo $BENCHER_API_TOKEN
IHR_TOKEN

­čÉ░ Hinweis: Wenn Sie zu einem anderen Terminal wechseln, m├╝ssen Sie das API-Token erneut exportieren.


Erstellen Sie ein Projekt

Jetzt, da wir ein Benutzerkonto und ein API-Token haben, k├Ânnen wir ein Projekt erstellen. Zuerst m├╝ssen wir wissen, zu welcher Organisation unser neues Projekt geh├Ârt.

F├╝hren Sie aus: bencher org ls

Sie sollten so etwas sehen:

$ 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"
  }
]

Ihre Ausgabe sollte leicht von der oben gezeigten abweichen:

  • Die uuid ist pseudorandom
  • Der name und slug basieren auf Ihrem Benutzernamen
  • Die created und modified Zeitstempel stammen von Ihrer Anmeldung

Wir k├Ânnen nun ein neues Projekt innerhalb Ihrer Organisation erstellen. Ersetzen Sie Ihren Organisations-slug durch das Argument --org (dh IHR_ORG_SLUG) im unten stehenden Befehl.

F├╝hren Sie aus: bencher project create --org IHR_ORG_SLUG --url http://www.savewalterwhite.com "Save Walter White"

Sie sollten so etwas sehen:

$ 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"
}

Wiederum sollte Ihr Ergebnis etwas anders aussehen als das oben gezeigte. Es ist nur wichtig, dass dieser Befehl funktioniert. Notieren Sie sich das Projekt slug Feld (z.B. save-walter-white-12345).


F├╝hren Sie einen Bericht aus

Endlich sind wir bereit, einige Benchmark-Metriken zu sammeln! Um die Sache einfach zu halten, verwenden wir in diesem Tutorial Testdaten.

F├╝hren Sie aus: bencher mock

Sie sollten so etwas sehen:

$ 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
    }
  }
}

Ihre Ausgabe sollte leicht von der oben gezeigten abweichen, da die Daten pseudorandom sind. Es ist nur wichtig, dass dieser Befehl funktioniert.


Jetzt f├╝hren wir einen Bericht mit Test-Benchmark-Messdaten aus. Ersetzen Sie Ihren Projekt slug durch das Argument --project (dh IHR_PROJECT_SLUG) im unten stehenden Befehl.

F├╝hren Sie aus: bencher run --project IHR_PROJECT_SLUG "bencher mock"

Sie sollten so etwas sehen:

$ 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

Sie k├Ânnen nun die Ergebnisse aus jedem der Benchmarks im Browser anzeigen. Klicken Sie auf die Links unter View results oder kopieren und f├╝gen Sie sie ein. Es sollte nur einen einzigen Datenpunkt f├╝r jedes Benchmark geben, also lassen Sie uns mehr Daten hinzuf├╝gen!


Zuerst setzen wir unseren Projektslug als Umgebungsvariable, damit wir ihn nicht mit --project bei jedem einzelnen Lauf angeben m├╝ssen.

F├╝hren Sie aus: export BENCHER_PROJECT=save-walter-white-12345

Wenn Sie dann ausf├╝hren: echo $BENCHER_PROJECT

Sollten Sie sehen:

$ echo $BENCHER_PROJECT
save-walter-white-12345

Lassen Sie uns den gleichen Befehl erneut ohne --project ausf├╝hren, um mehr Daten zu generieren.

F├╝hren Sie aus: bencher run "bencher mock"


Jetzt generieren wir mehr Daten, aber diesmal leiten wir unsere Ergebnisse in bencher run um.

F├╝hren Sie aus: bencher mock | bencher run


Manchmal m├Âchten Sie vielleicht Ihre Ergebnisse in einer Datei speichern und bencher run holt sie ab.

F├╝hren Sie aus: bencher run "bencher mock > results.json" --file results.json


Ebenso k├Ânnte ein separater Prozess Ihre Benchmarks durchf├╝hren und Ihre Ergebnisse in einer Datei speichern. Dann holt bencher run sie einfach ab.

F├╝hren Sie aus: bencher mock > results.json && bencher run --file results.json


Schlie├člich lassen Sie uns eine Menge Daten mit dem Argument --iter von bencher run generieren.

F├╝hren Sie aus: bencher run --iter 16 "bencher mock"


­čÉ░ Tipp: Schauen Sie sich die Unterlagen zu bencher run CLI-Unterbefehl f├╝r einen vollst├Ąndigen ├ťberblick dar├╝ber, was bencher run alles kann!


Erstellen Sie einen Alert

Jetzt, da wir einige historische Daten f├╝r unsere Benchmarks haben, lassen Sie uns einen Alert generieren! Alerts werden erzeugt, wenn ein Benchmark-Ergebnis als Leistungsr├╝ckgang erkannt wird. Also simulieren wir einen Leistungsr├╝ckgang!

F├╝hren Sie aus: bencher run "bencher mock --pow 8"


Am Ende der Ausgabe sollte ein neuer Abschnitt namens 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

Sie k├Ânnen nun die Alerts f├╝r jedes Benchmark im Browser anzeigen. Klicken Sie auf die Links unter View alerts oder kopieren und f├╝gen Sie sie ein.


­čÉ░ Tipp: Schauen Sie sich die Schwellenwert- & Alert-Dokumentation f├╝r einen vollst├Ąndigen ├ťberblick dar├╝ber an, wie Leistungsr├╝ckg├Ąnge erkannt werden!



­čÉ░ Herzlichen Gl├╝ckwunsch! Sie haben Ihren ersten Leistungseinbruch erkannt! ­čÄë


Weiter: ├ťbersicht ├╝ber Benchmarking Ô×í

­čĄľ Dieses Dokument wurde automatisch von OpenAI GPT-4 generiert. Es ist m├Âglicherweise nicht korrekt und kann Fehler enthalten. Wenn Sie Fehler finden, ├Âffnen Sie bitte ein Problem auf GitHub.