Адаптеры для профилировщиков


Адаптеры преобразуют вывод данных профилировщиков в стандартизированный JSON формат - Bencher Metric Format (BMF). Адаптеры работают на API-сервере при получении нового отчета. Более глубокое объяснение можно найти в обзоре тестирования производительности. Адаптеры могут быть указаны в подкоманде CLI bencher run с опциональным флагом --adapter. Если адаптер не указан, по умолчанию используется адаптер magic.

Лучше всего использовать наиболее подходящий адаптер для вашего кейса. Это обеспечит наиболее точный и производительный разбор. Например, если вы разбираете вывод Rust libtest bench, вы должны использовать адаптер rust_bench, а не magic или rust адаптер. Посмотрите на нашей странице Bencher perf хорошее сравнение.

🪄 Magic (по умолчанию)

Адаптер Magic (magic) включает в себя все другие адаптеры. По этой причине, он является адаптером по умолчанию для bencher run, но наилучшим образом подходит только для исследовательских целей. В CI вы должны использовать наиболее подходящий адаптер для вашего кейса.

{…} JSON

Адаптер JSON (json) ожидает формат BMF JSON. Это идеальное решение для интеграции собственных профилировщиков с Bencher.

Пример BMF:

{
"benchmark_name": {
"latency": {
"value": 88.0,
"lower_value": 87.42,
"upper_value": 88.88
}
}
}

В этом примере, ключ benchmark_name будет названием теста производительности. Названия тестов могут быть любыми непустыми строками длиной до 1024 символов. Объект benchmark_name содержит подобные кодам (слагам) или UUIDы Measure в виде ключей. В этом примере, latency это код для Measure Latency. Каждый проект по умолчанию имеет Measure Latency (т.е. latency) и Throughput (т.е. throughput), которые измеряются в наносекундах (ns) и операций / секунда (ops/s) соответственно. Объект Measure содержит Metric с до трех мер: value, lower_value, и upper_value. Меры lower_value и upper_value являются опциональными, и их расчет специфичен для каждого профилировщика.

В этом примере, объект Measure latency содержит следующие Mетрики:

  • value в размере 88.0
  • lower_value в размере 87.42
  • upper_value в размере 88.88

Если BMF JSON сохранен в файл, то вы можете использовать подкоманду CLI bencher run с опциональным аргументом --file чтобы указать путь к этому файлу. Это работает как с командой тестирования производительности (например: bencher run "bencher mock > results.json" --file results.json), так и без команды тестирования производительности (например: bencher mock > results.json && bencher run --file results.json).

description: Benchmark Name
type: object
additionalProperties:
description: Measure Name, Slug, or UUID
type: object
properties:
value:
type: number
format: float
required: true
lower_value:
type: number
format: float
required: false
upper_value:
type: number
format: float
required: false

🐰 Примечание: Подкоманда CLI bencher mock генерирует имитационные данные BMF Metrics.

#️⃣ C#

Адаптер для C# (c_sharp) включает в себя c_sharp_dot_net.

#️⃣ C# DotNet

Адаптер для DotNet C# (c_sharp_dot_net) ожидает вывод BenchmarkDotNet в формате JSON (т.е. --exporters json). Measure latency (т.е. наносекунды (ns)) собирается.

Есть два варианта для metрик:

  • mean (по умолчанию): lower_value и upper_value это значения на одно стандартное отклонение вниз и вверх от среднего значения (т.е. value) соответственно.
  • median: lower_value и upper_value это значения на один межквартильный размах вниз и вверх от медианы (т.е. value) соответственно.

Это можно указать в подкоманде CLI bencher run с опциональным флагом --average.

➕ C++

Адаптер для C++ (cpp) включает в себя cpp_catch2 и cpp_google.

➕ C++ Catch2

Адаптер для C++ Catch2 (cpp_catch2) ожидает вывод Catch2. Measure latency (т.е. наносекунды (ns)) собирается. lower_value и upper_value это значения на одно стандартное отклонение вниз и вверх от среднего значения (т.е. value) соответственно.

➕ C++ Google

Адаптер для C++ Google (cpp_google) ожидает вывод Google Benchmark в формате JSON (т.е. --benchmark_format=json). Measure latency (т.е. наносекунды (ns)) собирается. Доступно только среднее значение (т.е. value). Нет lower_value и upper_value.

🕳 Go

Адаптер для Go (go) включает в себя go_bench.

🕳 Go Bench

Адаптер Go Bench (go_bench) ожидает вывод go test -bench. Measure latency (т.е. наносекунды (ns)) собирается. Доступно только среднее значение (т.е. value). Нет lower_value и upper_value.

☕️ Java

Адаптер для Java (java) включает в себя java_jmh.

☕️ Java JMH

Адаптер для Java JMH (java_jmh) ожидает вывод Java Microbenchmark Harness (JMH) в формате JSON (т.е. -rf json). Могут быть собраны Measures latency и throughput (т.е. наносекунды (ns) и операции / секунда (ops/sec)). lower_value и upper_value это нижний и верхний доверительный интервалы для среднего значения (т.е. value) соответственно.

🕸 JavaScript

Адаптер для JavaScript (js) включает в себя js_benchmark и js_time.

🕸 JavaScript Benchmark

Адаптер JavaScript Benchmark (js_benchmark) ожидает вывод Benchmark.js. Measure throughput (т.е. операции / секунда (ops/sec)) собирается. lower_value и upper_value это относительная погрешность вниз и вверх от медианы (т.е. value) соответственно.

🕸 JavaScript Time

Адаптер JavaScript Time (js_time) ожидает вывод console.time/console.timeEnd. Measure latency (т.е. наносекунды (ns)) собирается. Доступно только время выполнения операции (т.е. value). Нет lower_value и upper_value.

🐍 Python

Адаптер для Python (python) включает в себя python_asv и python_pytest.

🐍 Python ASV

Адаптер Python ASV (python_asv’) ожидает вывод [airspeed velocity](https://github.com/airspeed-velocity/asv) CLI [asv run](https://asv.readthedocs.io/en/stable/commands.html#asv-run). Measure latency(т.е.наносекунды (ns)) собираются. lower_valueиupper_valueэто величины на один межквартильный размах вниз и вверх от медианы (т.е.value`) соответственно.

🐍 Python Pytest

Адаптер Python Pytest (python_pytest) ожидает вывод pytest-benchmark в формате JSON (т.е. --benchmark-json results.json). Этот вывод JSON сохраняется в файл, поэтому вы должны использовать аргумент -file команды CLI bencher run, чтобы указать путь к этому файлу (т.е. bencher run --file results.json "pipenv run pytest --benchmark-json results.json benchmarks.py"). Measure latency(т.е. наносекунды (ns)) собирается.

Есть два варианта для Metriк:

  • mean (по умолчанию): lower_value и upper_value это значения на одно стандартное отклонение вниз и вверх от среднего значения (т.е. value) соответственно.
  • median: lower_value и upper_value это значения на один межквартильный размах вниз и вверх от медианы (т.е. value) соответственно.

Это можно указать в подкоманде CLI bencher run с опциональным аргументом --average.

♦️ Ruby

Адаптер для Ruby (ruby) включает в себя ruby_benchmark.

♦️ Ruby Benchmark

Адаптер Ruby Benchmark (ruby_benchmark) ожидает вывод Benchmark module для методов #bm, #bmbm, и #benchmark. Требуется метка для каждого теста производительности. Measure latency (т.е. наносекунды (ns)) собирается. Доступно только сообщаемое значение (т.е. value). Нет lower_value и upper_value.

🦀 Rust

Адаптер для Rust (rust) включает в себя rust_bench и rust_criterion.

🦀 Rust Bench

Адаптер Rust Bench (rust_bench) ожидает вывод libtest bench. Measure latency (т.е. наносекунды (ns)) собирается. lower_value и upper_value это отклонение вниз и вверх от медианы (т.е. value) соответственно.

🦀 Rust Criterion

Адаптер Rust Criterion (rust_criterion) ожидает вывод Criterion. Measure latency (т.е. наносекунды (ns)) собирается. lower_value и upper_value это нижний и верхний доверительные интервалы для среднего значения (т.е. value) соответственно.

🦀 Rust Iai

Адаптер Rust Iai (rust_iai) ожидает вывод Iai. Собираются Measures instructions, l1_access, l2_access, ram_access, и estimated_cycles. Доступны только эти меры (т.е. value). Нет lower_value и upper_value. Measures для этого адаптера не создаются по умолчанию для всех проектов. Однако, когда вы используете этот адаптер, эти Measures будут автоматически созданы для вашего проекта.

🦀 Rust Iai-Callgrind

Адаптер Rust Iai (rust_iai_callgrind) ожидает вывод Iai-Callgrind. Собираются меры instructions, l1_access, l2_access, ram_access, total_accesses и estimated_cycles. Доступны только эти меры (т.е. value). Нет мер lower_value и upper_value. Меры для этого адаптера не создаются автоматически для всех проектов. Однако, когда вы используете этот адаптер, эти меры будут автоматически созданы для вашего проекта.

❯_ Shell

Адаптер Shell (shell) является надстройкой над shell_hyperfine.

❯_️ Shell Hyperfine

Адаптер Shell Hyperfine (shell_hyperfine) ожидает вывод Hyperfine в формате JSON (то есть --export-json results.json) Этот JSON-вывод сохраняется в файл, поэтому вы должны использовать аргумент --file CLI bencher run, чтобы указать этот путь к файлу (то есть bencher run --file results.json "hyperfine --export-json results.json 'sleep 0.1'"). Собирается метрика latency (то есть наносекунды (ns)).

Есть два варианта для метрики:

  • mean (по умолчанию): lower_value и upper_value - это одно стандартное отклонение ниже и выше среднего значения (value) соответственно.
  • median: lower_value и upper_value - это min и max значения соответственно.

Это можно указать в подкоманде CLI bencher run с необязательным флагом --average.



🐰 Поздравляем! Вы узнали все об адаптерах для профилировки производительности! 🎉


Продолжайте изучение материал: Пороговые значения и уведомления ➡

🤖 Этот документ был автоматически создан OpenAI GPT-4. Оно может быть неточным и содержать ошибки. Если вы обнаружите какие-либо ошибки, откройте проблему на GitHub.