欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

运行结果如下:
google benchmark使用教程
结果说明:
第一列是程序名称,第二列是平均迭代一次的时钟时间,第三列是平均迭代一次的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(); 

执行结果如下:
google benchmark使用教程

注明: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(); //程序入口