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.