0Pricing
C++ Academy · Урок

Микротестирование с Google Benchmark

Пишите надёжные микротесты с помощью Google Benchmark и избегайте ошибок измерения.

«Микротестирование с Google Benchmark» — бесплатный урок C++ Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.

Зачем нужны микротесты

Профилирование приложения показывает, на что тратится время. Микротесты измеряют конкретный фрагмент кода изолированно — это полезно для сравнения алгоритмов или реализаций.

Настройка Google Benchmark

Библиотека тестирования производительности C++ от Google, почти состоящая только из заголовочных файлов. Установите её через vcpkg, Conan или apt; свяжите с помощью -lbenchmark.

#include <benchmark/benchmark.h>

static void BM_StringCopy(benchmark::State& state) {
    std::string s = "Hello, World!";
    for (auto _ : state) {
        std::string copy(s);
    }
}
BENCHMARK(BM_StringCopy);
BENCHMARK_MAIN();

Компиляция и запуск

Скомпилируйте программу с оптимизацией, свяжите её с библиотекой тестирования производительности и запустите.

g++ -O2 -DNDEBUG bench.cpp -lbenchmark -lpthread -o bench
./bench

Интерпретация результатов

Библиотека выводит время на итерацию, число итераций и время CPU. Сравнивайте исходные показатели с результатами предлагаемых изменений.

Как избежать уловок оптимизатора

Оптимизатор может удалить бесполезный код. Используйте benchmark::DoNotOptimize, чтобы принудительно сделать результат «значимым».

for (auto _ : state) {
    auto result = expensive_function();
    benchmark::DoNotOptimize(result);
}

Предотвращение ненужных записей

benchmark::ClobberMemory сообщает компилятору, что состояние памяти было просмотрено, — это предотвращает удаление записей.

Параметризованные тесты производительности

Проверяйте одну и ту же функцию при разных размерах входных данных.

static void BM_Sort(benchmark::State& state) {
    std::vector<int> v(state.range(0));
    std::iota(v.rbegin(), v.rend(), 0);
    for (auto _ : state) {
        auto copy = v;
        std::sort(copy.begin(), copy.end());
    }
}
BENCHMARK(BM_Sort)->RangeMultiplier(2)->Range(8, 1<<14);

Многопоточные тесты производительности

Проверяйте масштабируемость с помощью модификатора Threads.

BENCHMARK(BM_ConcurrentMap)->Threads(1)->Threads(4)->Threads(16);

Пользовательские счётчики

Отслеживайте предметно-ориентированные показатели, например байты/с или элементов/с.

state.SetItemsProcessed(state.iterations() * input.size());
state.SetBytesProcessed(state.iterations() * input.size() * sizeof(int));

Статистические результаты

Запустите тест с параметром --benchmark_repetitions=10, чтобы получить среднее значение, медиану и стандартное отклонение. Библиотека выводит их автоматически.

Распространённые ошибки

Остерегайтесь следующего:

  • Компилятор удаляет «мёртвый» код → используйте DoNotOptimize
  • Эффекты прогрева → измеряйте много итераций
  • Изменение частоты CPU → закрепите поток за ядром и отключите режим ускорения
  • Работа других процессов → запускайте тест производительности на незагруженной машине

Критическая оценка чисел

Улучшение на 5% может быть всего лишь шумом измерений. Выполните несколько повторов и доверяйте только статистически значимым различиям. Сравнивайте результаты с известными исходными показателями.

Альтернативы

Другие инструменты для микротестов:

  • Nonius — заголовочная библиотека тестирования производительности C++
  • Hayai — более старая, но лёгкая библиотека
  • Catch2 имеет встроенную поддержку тестов производительности

Быстрая проверка

Зачем использовать benchmark::DoNotOptimize(result) внутри цикла тестирования производительности?

Итоги

Используйте Google Benchmark для детальных измерений. Предотвращайте уловки компилятора с помощью DoNotOptimize и ClobberMemory. Используйте параметризованные и многопоточные тесты производительности, чтобы изучать поведение при разных входных данных и уровнях параллелизма. Доверяйте только статистически значимым различиям.

Часто задаваемые вопросы

Урок «Микротестирование с Google Benchmark» бесплатный?

Да — полный текст урока «Микротестирование с Google Benchmark» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.

Чему я научусь в уроке «Микротестирование с Google Benchmark»?

Пишите надёжные микротесты с помощью Google Benchmark и избегайте ошибок измерения. Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C++ Academy?

Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Микротестирование с Google Benchmark»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C++ Academy?

Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Структуры данных, эффективные для кэша
  2. Предсказание ветвлений и горячие циклы
  3. Профилирование с perf, vtune и санитайзерами
  4. Микротестирование с Google Benchmark
← Назад к C++ Academy