c++性能测试工具:google benchmark入门(一)

如果你正在寻找一款c++性能测试工具,那么这篇文章是不容错过的。

市面上的benchmark工具或多或少存在一些使用上的不便,那么是否存在一个使用简便又功能强大的性能测试工具呢?答案是google/benchmark

google/benchmark是一个由Google开发的基于googletest框架的c++ benchmark工具,它易于安装和使用,并提供了全面的性能测试接口。

下面我将介绍google/benchmark的安装并用一个简短的例子介绍它的简单使用。

安装google/benchmark

google/benchmark基于c++11标准和googletest框架,所以安装前需要先做一些准备工作。

首先是安装g++和cmake。

Debian/Ubuntu:

sudo apt install g++ cmake

Arch Linux/Manjaro Linux:

sudo pacman -s g++ cmake

确保你的g++版本在5.0以上,否则可能不能很好地支持c++11的某些特性。

然后是googletest框架,你可以选择单独安装,不过这里我选择将其作为benchmark源码树的依赖而不单独安装它,因为benchmark在编译安装时需要googletest但是在使用时并不需要,为了篇幅我们选择后者。

准备工作完成后选择一个合适的目录,然后运行下面的命令:

git clone https://github.com/google/benchmark.git
git clone https://github.com/google/googletest.git benchmark/googletest
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=RELEASE ../benchmark
make -j4
# 如果想全局安装就接着运行下面的命令
sudo make install

头文件会被安装至/usr/local/include,库文件会安装至/usr/local/lib

现在安装完成了,我们来看看benchmark如何使用。

google/benchmark的简单使用

我们的例子将会对比三种访问std::array容器内元素方法的性能,进而演示benchmark的使用方法。

先看代码:

#include <benchmark/benchmark.h>
#include <array>

constexpr int len = 6;

// constexpr function具有inline属性,你应该把它放在头文件中
constexpr auto my_pow(const int i)
{
    return i * i;
}

// 使用operator[]读取元素,依次存入1-6的平方
static void bench_array_operator(benchmark::State& state)
{
    std::array<int, len> arr;
    constexpr int i = 1;
    for (auto _: state) {
        arr[0] = my_pow(i);
        arr[1] = my_pow(i+1);
        arr[2] = my_pow(i+2);
        arr[3] = my_pow(i+3);
        arr[4] = my_pow(i+4);
        arr[5] = my_pow(i+5);
    }
}
BENCHMARK(bench_array_operator);

// 使用at()读取元素,依次存入1-6的平方
static void bench_array_at(benchmark::State& state)
{
    std::array<int, len> arr;
    constexpr int i = 1;
    for (auto _: state) {
        arr.at(0) = my_pow(i);
        arr.at(1) = my_pow(i+1);
        arr.at(2) = my_pow(i+2);
        arr.at(3) = my_pow(i+3);
        arr.at(4) = my_pow(i+4);
        arr.at(5) = my_pow(i+5);
    }
}
BENCHMARK(bench_array_at);

// std::get<>(array)是一个constexpr function,它会返回容器内元素的引用,并在编译期检查数组的索引是否正确
static void bench_array_get(benchmark::State& state)
{
    std::array<int, len> arr;
    constexpr int i = 1;
    for (auto _: state) {
        std::get<0>(arr) = my_pow(i);
        std::get<1>(arr) = my_pow(i+1);
        std::get<2>(arr) = my_pow(i+2);
        std::get<3>(arr) = my_pow(i+3);
        std::get<4>(arr) = my_pow(i+4);
        std::get<5>(arr) = my_pow(i+5);
    }
}
BENCHMARK(bench_array_get);

BENCHMARK_MAIN();

我们可以看到每一个benchmark测试用例都是一个类型为std::function<void(benchmark::State&)>的函数,其中benchmark::State&负责测试的运行及额外参数的传递。

随后我们使用for (auto _: state) {}来运行需要测试的内容,state会选择合适的次数来运行循环,时间的计算从循环内的语句开始,所以我们可以选择像例子中一样在for循环之外初始化测试环境,然后在循环体内编写需要测试的代码。

测试用例编写完成后我们需要使用BENCHMARK(<function_name>);将我们的测试用例注册进benchmark,这样程序运行时才会执行我们的测试。

最后是用BENCHMARK_MAIN();替代直接编写的main函数,它会处理命令行参数并运行所有注册过的测试用例生成测试结果。

示例中大量使用了constexpt,这是为了能在编译期计算出需要的数值避免对测试产生太多噪音。

然后我们编译测试程序:

g++ -Wall -std=c++14 -pthread -lbenchmark benchmark_example.cpp

benchmark需要链接libbenchmark.so,所以需要指定-lbenchmark,此外还需要thread的支持,因为libstdc++不提供thread的底层实现,我们需要pthread。另外不建议使用-lpthread,官方表示会出现兼容问题,在我这测试也会出现链接错误。

编译好程序后就可以运行测试了:

显示的警告信息表示在当前系统环境有一些噪音(例如其他在运行的程序)可能导致结果不太准确,并不影响我们的测试。

测试结果与预期基本相符,std::get最快,at()最慢。

以上就是google/benchmark的安装和简单使用,下一篇文章中我会介绍更多使用benchmark的技巧,如有错误欢迎指正。

原文地址:https://www.cnblogs.com/apocelipes/p/10348925.html

时间: 2024-08-27 15:31:12

c++性能测试工具:google benchmark入门(一)的相关文章

开源性能测试工具JMeter快速入门(一)

目录 一.JMeter简介 二.JMeter功能介绍 三.JMeter脚本 四.关于JMeter小提示 一.JMeter简介 1.定义 JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域. 1)它可以用于测试静态和动态资源,例如静态文件.Java 小服务程序.CGI 脚本.Java 对象.DB.FTP 服务器, 等等. 2)JMeter 可以用于对服务器.网络或对象模拟巨大的负载,来自不同压力类别下测试它

Web性能测试工具之ab入门篇

1. ab简介 ab全称Apache Bench,是apache附带的一个小工具,它可以同时模拟多个并发请求,测试apache等Web服务器的最大负载压力. 本文通过一个简单的示例,介绍了使用ab进行web页面性能测试.查看结果方法及运行参数详解. 运行环境为Windows 10系统. 2. ab下载 Apache官网:http://httpd.apache.org/download.cgi 2.1 Windows系统 对于windows系统,可访问页面https://www.apachelou

开源性能测试工具JMeter快速入门(二)

目录 一.JMeter简介 二.JMeter功能介绍 三.JMeter脚本 四.关于JMeter小提示 三.JMeter脚本 1.测试计划 测试计划是JMeter进行测试的起点 ,是其他JMeter测试元件的容器,每个测试场景/脚本都叫做一个测试计划. (1)名称;与业务相关的名称 (2)注释:非必填 (3)用户定义的变量,引用时直接用${变量名}即可,这里的变量是全局变量,作用于整个测试计划. (4)独立运行每个线程组:默认不勾选,即所有线程组并发启动.勾选则顺序执行所有线程组. (5) 结束

性能测试入门(三):性能测试工具

这篇文章介绍下性能测试工具: 简单模拟工具 有很多场景下,我们只是想做一个简单的压测,对于监测结果要求并不高,压测的场景也比较简单,不想安装复杂的工具,这种情况下,推荐使用简单的模拟工具进行就可以了. ab ab即ApacheBench,是apache自带的一款功能强大的测试工具,安装了apache一般就自带了,即httpd(在bin目录下). ab主要是设计用来测试apache的性能,但是使用ab可以同时模拟多个并发请求,专门用于HTTP Server的压测, 优点是: 小巧.性能好 post

前端性能测试工具

概要:要提升前端性能,有两大思路: 1>.减少页面加载所需要的时间. 2>.提升用户的观感,让用户觉得页面更快. 减少页面加载所需的时间,可以从请求的数量.请求的并发度及网络传输时间等方面来着手:而提升用户观感,则主要从让页面尽快开始显示入手. 常用的前端性能测试工具: 1.Apache Benchmark工具,简称ab,命令如下: ab -c[并发用户数量] -n[发出请求的数量] [被测试页面的URL] 2.Firebug工具 Firebug工具是一个备受推崇的.强大的Web开发工具,它提

YCSB性能测试工具使用

在网上查In-Memory NoSQL性能测试的资料时,偶然间发现了这个性能测试工具YCSB,全称为"Yahoo! Cloud Serving Benchmark".它内置了对常见NoSQL数据库和数据网格产品的支持,如Cassandra.MongoDB.HBase.Redis.Infinispan等等很多的主流产品,而且不仅安装使用简单,还能自由扩展测试数据类型和支持的数据库产品. 1 编译安装 首先说一下YCSB的安装.直接下载tar.gz分发包的话其实也不需要安装什么,解压后通过

高性能WEB开发(6) - web性能测试工具推荐

WEB性能测试工具主要分为三种,一种是测试页面资源加载速度的,一种是测试页面加载完毕后页面呈现.JS操作速度的,还有一种是总体上对页面进行评价分析,下面分别对这些工具进行介绍,如果谁有更好的工具也请一起分享下. Firebug: Firebug 是firefox中最为经典的开发工具,可以监控请求头,响应头,显示资源加载瀑布图: HttpWatch : httpwatch 功能类似firebug,可以监控请求头,响应头,显示资源加载瀑布图.但是httpwatch还能显示GZIP压缩信息,DNS查询

性能测试工具--SIEGE安装及使用简介

官方网站http://www.joedog.org/ 概述 Siege是一个多线程http负载测试和基准测试工具.它有3种操作模式: 1) Regression (when invoked by bombardment)Siege从配置文件中读取URLs,按递归方式,逐个发送请求 2) Internet simulation (Siege从配置文件中读取URLs,随机选取URL发送请求) 3) Brute force (在命令行上写上一个单独的URL,发送请求) 安装 我这里使用的是最新版的.$

Mysql多线程性能测试工具sysbench 安装、使用和测试

From:http://www.cnblogs.com/zhoujinyi/archive/2013/04/19/3029134.html 摘要:      sysbench是一个开源的.模块化的.跨平台的多线程性能测试工具,可以用来进行CPU.内存.磁盘I/O.线程.数据库的性能测试.目前支持的数据库有MySQL.Oracle和PostgreSQL.当前功能允许测试的系统参数有: file I/O performance (文件I / O性能) scheduler performance (调