Google Benchmark性能測試
Google Benchmark 是一個用于 C++ 的微基準測試框架,專為測量小塊代碼的性能而設計。它提供了一種簡單而強大的方式來編寫、運行和分析基準測試,幫助開發人員識別性能瓶頸并優化代碼。本教程將從安裝和基本用法開始,逐步深入到高級功能,并通過 C++ 示例演示如何結合測試實踐。
1. 安裝 Google Benchmark
在 Ubuntu 上安裝 Google Benchmark 非常簡單。以下是安裝步驟:
-
更新軟件包列表:
sudo apt-get update
-
安裝 Google Benchmark:
sudo apt-get install libbenchmark-dev
-
驗證安裝:
安裝完成后,你可以通過編譯一個簡單的基準測試程序來驗證安裝是否成功。
2. 基本用法
Google Benchmark 的基本用法是定義一個基準測試函數,并使用 BENCHMARK
宏注冊它。以下是一個簡單的示例:
示例 1:測量函數執行時間
代碼
#include <benchmark/benchmark.h>
#include <chrono>
#include <thread>void BM_Sleep(benchmark::State& state) {for (auto _ : state) {std::this_thread::sleep_for(std::chrono::milliseconds(100));}
}BENCHMARK(BM_Sleep);BENCHMARK_MAIN();
編譯和運行
-
編譯:
g++ -std=c++11 -O2 -o benchmark_example benchmark_example.cpp -lbenchmark -lpthread
-lbenchmark
鏈接 Google Benchmark 庫。-lpthread
鏈接 pthread 庫(Google Benchmark 依賴)。
-
運行:
./benchmark_example
輸出分析
運行后,你將看到類似以下的輸出:
2023-10-01 12:00:00
Running ./benchmark_example
Run on (8 X 4200 MHz CPU s)
CPU Caches:L1 Data 32 KiB (x4)L1 Instruction 32 KiB (x4)L2 Unified 256 KiB (x4)L3 Unified 8192 KiB (x1)
***WARNING*** CPU scaling is enabled, the benchmark real time measurements may be noisy and will incur extra overhead.
---------------------------------------------------------
Benchmark Time CPU Iterations
---------------------------------------------------------
BM_Sleep 100000000 ns 100000000 ns 7
- Time:每次迭代的平均時間。
- CPU:每次迭代的 CPU 時間。
- Iterations:基準測試運行的迭代次數。
示例 2:測量不同參數下的性能
Google Benchmark 允許你通過 Range
或 Args
指定參數,測試不同輸入下的性能。
代碼
#include <benchmark/benchmark.h>
#include <vector>void BM_VectorPushBack(benchmark::State& state) {for (auto _ : state) {std::vector<int> v;for (int i = 0; i < state.range(0); ++i) {v.push_back(i);}}
}BENCHMARK(BM_VectorPushBack)->Range(8, 8<<10);BENCHMARK_MAIN();
編譯和運行
-
編譯:
g++ -std=c++11 -O2 -o benchmark_range benchmark_range.cpp -lbenchmark -lpthread
-
運行:
./benchmark_range
輸出分析
輸出將顯示不同 vector 大小下的性能:
---------------------------------------------------------
Benchmark Time CPU Iterations
---------------------------------------------------------
BM_VectorPushBack/8 10 ns 10 ns 10000000
BM_VectorPushBack/64 80 ns 80 ns 1000000
BM_VectorPushBack/512 640 ns 640 ns 100000
BM_VectorPushBack/4096 5120 ns 5120 ns 10000
BM_VectorPushBack/32768 40960 ns 40960 ns 1000
這表明隨著 vector 大小的增加,push_back
操作的耗時也相應增加。
3. 高級功能
Google Benchmark 還提供了一些高級功能,幫助你更精細地控制基準測試。
3.1 自定義計時
你可以使用 DoNotOptimize
和 ClobberMemory
來防止編譯器優化掉你的代碼。
代碼
#include <benchmark/benchmark.h>void BM_CustomTiming(benchmark::State& state) {for (auto _ : state) {int result = 0;for (int i = 0; i < 1000; ++i) {result += i;}benchmark::DoNotOptimize(result);benchmark::ClobberMemory();}
}BENCHMARK(BM_CustomTiming);BENCHMARK_MAIN();
DoNotOptimize
:防止編譯器優化掉result
。ClobberMemory
:確保內存操作不被優化。
3.2 測量內存使用
Google Benchmark 允許你測量內存使用情況。
代碼
#include <benchmark/benchmark.h>
#include <vector>void BM_MemoryUsage(benchmark::State& state) {for (auto _ : state) {std::vector<int> v(state.range(0), 0);benchmark::DoNotOptimize(v.data());}state.SetBytesProcessed(state.iterations() * state.range(0) * sizeof(int));
}BENCHMARK(BM_MemoryUsage)->Range(8, 8<<10);BENCHMARK_MAIN();
SetBytesProcessed
:設置每次迭代處理的字節數,用于計算吞吐量。
3.3 多線程基準測試
你可以使用 Threads
指定線程數,測試多線程環境下的性能。
代碼
#include <benchmark/benchmark.h>
#include <atomic>std::atomic<int> counter(0);void BM_AtomicIncrement(benchmark::State& state) {for (auto _ : state) {counter++;}
}BENCHMARK(BM_AtomicIncrement)->Threads(4);BENCHMARK_MAIN();
Threads(4)
:在 4 個線程中運行基準測試。
4. 結合測試實踐
在實際開發中,基準測試應與單元測試和性能分析工具結合使用,以確保代碼的正確性和高效性。
4.1 與單元測試集成
你可以在 CI/CD 管道中運行基準測試,監控性能變化。
4.2 與性能分析工具結合
使用 perf
或 Valgrind
等工具,深入分析基準測試結果,定位瓶頸。