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


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

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

Сравнение адаптеров для Bencher - Bencher

🪄 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ы Metric Kind в виде ключей. В этом примере, latency это код для Metric Kind Latency. Каждый проект по умолчанию имеет Metric Kind Latency (т.е. latency) и Throughput (т.е. throughput), которые измеряются в наносекундах (ns) и операций / секунда (ops/s) соответственно. Объект Metric Kind содержит Metric с до трех мер: value, lower_value, и upper_value. Меры lower_value и upper_value являются опциональными, и их расчет специфичен для каждого профилировщика.

В этом примере, объект Metric Kind 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).


🐰 Примечание: Подкоманда 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). Metric Kind 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. Metric Kind latency (т.е. наносекунды (ns)) собирается. lower_value и upper_value это значения на одно стандартное отклонение вниз и вверх от среднего значения (т.е. value) соответственно.

➕ C++ Google

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

🕳 Go

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

🕳 Go Bench

Адаптер Go Bench (go_bench) ожидает вывод go test -bench. Metric Kind 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). Могут быть собраны Metric Kinds 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. Metric Kind throughput (т.е. операции / секунда (ops/sec)) собирается. lower_value и upper_value это относительная погрешность вниз и вверх от медианы (т.е. value) соответственно.

🕸 JavaScript Time

Адаптер JavaScript Time (js_time) ожидает вывод console.time/console.timeEnd. Metric Kind 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). Metric Kind 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"). Metric Kind 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. Требуется метка для каждого теста производительности. Metric Kind latency (т.е. наносекунды (ns)) собирается. Доступно только сообщаемое значение (т.е. value). Нет lower_value и upper_value.

🦀 Rust

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

🦀 Rust Bench

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

🦀 Rust Criterion

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

🦀 Rust Iai

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



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


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

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