Микротестирование с 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 — локальная установка не требуется.
Все уроки этого курса
- Структуры данных, эффективные для кэша
- Предсказание ветвлений и горячие циклы
- Профилирование с perf, vtune и санитайзерами
- Микротестирование с Google Benchmark