google benchmark使用教程
程序员文章站
2022-04-19 16:12:54
...
下载地址
https://github.com/google/benchmark
功能
google benchmark主要是对c++中的函数进行基准功能测试。
编译安装
登录 linux环境,执行以下命令,进行编译安装:
git clone https://github.com/google/benchmark.git
cd benchmark
git clone https://github.com/google/googletest.git
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=RELEASE
make
sudo make install
运行使用
基本功能
在demo.cpp文件中,定义了一个函数demo,并对该函数进行基准测试。
#include <benchmark/benchmark.h>
#include <iostream>
#include <string>
using namespace std;
void demo()
{
string str = "hello world";
str.size();
}
static void BM_demo(benchmark::State& state) {
for (auto _ : state)
demo();
}
// Register the function as a benchmark
BENCHMARK(BM_demo); //用于注册测试函数
BENCHMARK_MAIN(); //程序入口
使用以下命令进行编译并运行:
g++ -o demo demo.cpp -std=c++11 -lpthread -lbenchmark
./demo
运行结果如下:
结果说明:
第一列是程序名称,第二列是平均迭代一次的时钟时间,第三列是平均迭代一次的CPU时间,第四列是循环的迭代次数。
时钟时间 = 阻塞时间 + 就绪时间 + 运行时间(也就是CPU时间)
传递参数
google-benchmark可以通过传递参数来进行一系列相关的标准测试。例如,通过传递参数,我们可以测试memcpy函数在不同内存大小情况下的执行效率:
#include <benchmark/benchmark.h>
#include <cstring>
static void BM_memcpy(benchmark::State& state) {
char* src = new char[state.range(0)];
char* dst = new char[state.range(0)];
memset(src, 'x', state.range(0));
for (auto _ : state)
memcpy(dst, src, state.range(0));
state.SetBytesProcessed(int64_t(state.iterations()) * int64_t(state.range(0)));
delete[] src;
delete[] dst;
}
BENCHMARK(BM_memcpy)->Arg(8)->Arg(64)->Arg(512)->Arg(1<<10)->Arg(8<<10);
BENCHMARK_MAIN();
执行结果如下:
注明:benchmark需要在一个循环里执行,因此benchmark需要用state来标明函数是否需要继续执行下去,程序中以
for (auto _ : state)这一段代码体现。
迭代次数指定
通过Iterations指定迭代次数
#include <benchmark/benchmark.h>
#include <iostream>
#include <string>
using namespace std;
void demo()
{
string str = "hello world";
str.size();
}
static void BM_demo(benchmark::State& state) {
for (auto _ : state)
demo();
}
// Register the function as a benchmark
BENCHMARK(BM_demo)->Iterations(1000); //指定BM_demo函数中,for循环的迭代次数
BENCHMARK_MAIN(); //程序入口