Inicio Rápido


¿Qué es Bencher?

Bencher es una suite de herramientas de benchmarking continuo. ¿Alguna vez tuviste un problema de rendimiento que afectó a tus usuarios? Bencher pudo haberlo evitado. Bencher te permite detectar y prevenir problemas de rendimiento antes de que lleguen a producción.

  • Ejecutar: Ejecuta tus pruebas benchmark localmente o en CI utilizando tus herramientas de benchmarking favoritas. El CLI bencher simplemente envuelve tu sistema de pruebas benchmark existente y almacena sus resultados.
  • Rastrear: Rastrea los resultados de tus pruebas benchmark a lo largo del tiempo. Monitorea, consulta y grafica los resultados utilizando la consola web Bencher basada en la rama de origen, la plataforma de prueba y el tipo de métrica.
  • Capturar: Captura problemas de rendimiento en CI. Bencher utiliza análisis de última generación y personalizables para detectar problemas de rendimiento antes de que lleguen a producción.

Por las mismas razones que las pruebas unitarias se ejecutan en CI para prevenir problemas de rendimiento, las pruebas benchmark deberían ejecutarse en CI con Bencher para prevenir problemas de rendimiento. ¡Los bugs de rendimiento son bugs!


Instalar el CLI bencher

Para instalar el CLI bencher necesitarás tener cargo instalado. Verifica si tienes cargo instalado.

Ejecuta: cargo --version

Deberías ver algo como:

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

Está bien si tu número de versión es diferente. Lo importante es que este comando funcione. Si no, sigue las instrucciones para instalar cargo a través de rustup.

En Linux o macOS, ejecuta:

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

Con cargo instalado, podemos instalar el CLI bencher.

Ejecuta:

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

Deberías ver algo como:

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

Nuevamente, está bien si tu resultado es diferente. Lo importante es que este comando funcione.


Finalmente, vamos a verificar que tenemos instalado el CLI bencher.

Ejecuta: bencher --version

Deberías ver:

$ bencher —version
bencher 0.3.18

Crea una Cuenta en Bencher Cloud

Bencher es de código abierto y autohospedable. Si estás interesado en autohospedarte, revisa el tutorial de Bencher Docker. Para este tutorial, vamos a usar Bencher Cloud.

Regístrate en Bencher Cloud


Una vez que hayas creado una cuenta, tendrás que confirmar tu dirección de correo electrónico. Revisa tu email para el enlace de confirmación. Después de eso, deberías estar conectado a Bencher Cloud.


Crea un Token de API

Para usar la API de Bencher, necesitarás crear un token de API. Ve al Consola de Bencher. Pasa el cursor sobre tu nombre en la esquina superior derecha. Debería aparecer un menú desplegable. Selecciona Tokens. Una vez en la página API Tokens, haz clic en el botón ➕ Add.

Añadir un Token de API


Una vez que hayas creado tu nuevo token de API, necesitarás copiarlo en tu portapapeles. En la terminal en la que planeas trabajar, exporta el token de la API como una variable de entorno.

Ejecuta: export BENCHER_API_TOKEN=TU_TOKEN

Si luego ejecutas: echo $BENCHER_API_TOKEN

Deberías ver:

$ echo $BENCHER_API_TOKEN
TU_TOKEN

🐰 Nota: Si cambias a una terminal diferente, necesitarás exportar el token de la API de nuevo.


Crea un Proyecto

Ahora que tenemos una cuenta de usuario y un token de API, podemos crear un Proyecto. Primero, necesitamos saber a qué organización pertenecerá nuestro nuevo proyecto.

Ejecuta: bencher org ls

Deberías ver algo como:

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

Tu salida debería ser ligeramente diferente a la anterior:

  • El uuid es pseudorandom.
  • El name y slug estarán basados en tu nombre de usuario.
  • Las marcas de tiempo created y modified serán de cuando te acabas de registrar.

Ahora podemos crear un nuevo Proyecto dentro de tu Organización. Sustituye el slug de tu Organización por el argumento --org (es decir, EL_SLUG_DE_TU_ORG) en el comando de abajo.

Ejecuta: bencher project create --org EL_SLUG_DE_TU_ORG --url http://www.salvemosaWalterWhite.com "Save Walter White"

Deberías ver algo como:

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

De nuevo, tu resultado debe ser ligeramente diferente al anterior. Lo importante es que este comando funcione. Toma nota del campo slug del Proyecto (es decir, save-walter-white-12345).


Ejecuta un Informe

¡Finalmente estamos listos para recoger algunas métricas de benchmark! Por simplicidad, vamos a usar datos simulados en este tutorial.

Ejecuta: bencher mock

Deberías ver algo como:

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

Tu salida debe ser ligeramente diferente a la anterior, ya que los datos son pseudorandom. Lo importante es que este comando funcione.


Ahora ejecutemos un informe utilizando datos simulados de métricas benchmark. Sustituye el slug de tu Proyecto por el argumento --project (es decir, EL_SLUG_DE_TU_PROYECTO) en el comando de abajo.

Ejecuta: bencher run --project EL_SLUG_DE_TU_PROYECTO "bencher mock"

Deberías ver algo como:

$ 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

Ahora puedes ver los resultados de cada una de las pruebas benchmark en el navegador. Haz clic o copia y pega los enlaces desde View results. Solo debería haber un único punto de datos para cada benchmark, ¡así que añadamos más datos!


Primero, establezcamos nuestro slug de Proyecto como una variable de entorno, para que no tengamos que proporcionarlo con el --project en cada ejecución.

Ejecuta: export BENCHER_PROJECT=save-walter-white-12345

Si luego ejecutas: echo $BENCHER_PROJECT

Deberías ver:

$ echo $BENCHER_PROJECT
save-walter-white-12345

Vamos a ejecutar el mismo comando de nuevo sin --project para generar más datos.

Ejecuta: bencher run "bencher mock"


Ahora, vamos a generar más datos, pero esta vez canalizaremos nuestros resultados en bencher run.

Ejecuta: bencher mock | bencher run


A veces es posible que desees guardar tus resultados en un archivo y que bencher run los recoja.

Ejecuta: bencher run "bencher mock > results.json" --file results.json


De igual manera, puedes tener un proceso separado que ejecute tus benchmarks y guarde tus resultados en un archivo. Entonces bencher run simplemente los recogerá.

Ejecuta: bencher mock > results.json && bencher run --file results.json


Finalmente, generemos muchos datos usando el argumento --iter de bencher run.

Ejecuta: bencher run --iter 16 "bencher mock"


🐰 Consejo: Consulta los documentos CLI Subcommand de bencher run para obtener una descripción completa de todo lo que bencher run puede hacer!


Generar una Alerta

Ahora que tenemos algunos datos históricos para nuestras pruebas benchmark, ¡generemos una Alerta! Las alertas se generan cuando se determina que el resultado de una prueba benchmark es una regresión de rendimiento. ¡Así que simulemos una regresión de rendimiento!

Ejecuta: bencher run "bencher mock --pow 8"


Debería haber una nueva sección al final de la salida llamada 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

Ahora puedes ver las Alertas para cada prueba benchmark en el navegador. Haz clic o copia y pega los enlaces desde View alerts.


🐰 Consejo: Consulta los documentos de Threshold & Alerts para obtener una descripción completa de cómo se detectan las regresiones de rendimiento!



🐰 ¡Felicidades! ¡Atrapaste tu primer regresión de rendimiento! 🎉


Continúa: Descripción General de Benchmarking ➡

🤖 Este documento fue generado automáticamente por OpenAI GPT-4. Puede que no sea exacto y contenga errores. Si encuentra algún error, abra un problema en GitHub.