《C++那些事》之开启你的BenchMark项目

《C++那些事》之开启你的BenchMark测试

0.导语

本节目标:完成一个BenchMark小项目!

在平时开发中,如何测试自己的接口性能呢?C++里面如何快速搭建一个BenchMark测试框架呢?

本节将Step By Step开启BenchMark入门的第一课。

d41800b83ce0720725e0d1a3a76f7364.png

1.项目结构

我们以vector与list插入为例,来讲解BenchMark项目。

这次项目是基于Bazel来管理的,如果还不知道如何配置相关环境的,请参考之前的视频课程/文档资料。

《C++那些事》Step By Step上手学习

创建一个项目结构为:

├── WORKSPACE

└── src

    ├── BUILD

    └── vector_list.cc

BenchMark采用google的开源项目:

https://github.com/google/benchmark.git

像以前大家使用第三方库,需要自己源码编译一波,生成so库,然后链接,太麻烦了!这里直接使用bazel管理,只需要在WORKSPACE里面,添加依赖的git项目,例如这里采用google benchmark的v1.7.1版本。

git_repository(
    name = "google_benchmark",
    remote = "https://github.com/google/benchmark.git",
    tag = "v1.7.1",
)

随后,我们需要实现主逻辑,创建一个src目录,里面添加一个BUILD文件:目的在于编译过会cpp文件,注意:这里依赖了benchmark库,使用方法为@前面配置的name//:benchmark

cc_binary(
    name = "vector_list",
    srcs = ["vector_list.cc"],
    deps = [
        "@google_benchmark//:benchmark",
    ]
)

这样的话,在cc文件中便可以使用了:

#include <benchmark/benchmark.h>

2.Demo环节

编写两个插入函数,非常简单,框架如下所示,里面有一些需要说明的,如下:

  • state为benchmark的运行时状态信息

    • 例如:休眠控制、入参数控制等

  • state.range(0)便是获取第0个参数

  • DoNotOptimize表示不做编译器优化

// 测试 std::vector 的插入速度
static void BM_vectorInsert(benchmark::State& state) {
    for (auto _ : state) {
        std::vector<int> v;
        for (size_t i = 0; i < state.range(0); ++i) {
            v.insert(v.begin() + i, i);
        }
        benchmark::DoNotOptimize(v);
    }
}

// 测试 std::list 的插入速度
static void BM_listInsert(benchmark::State& state) {
    for (auto _ : state) {
        std::list<int> l;
        for (size_t i = 0; i < state.range(0); ++i) {
            l.insert(l.begin(), i);
        }
        benchmark::DoNotOptimize(l);
    }
}

主入口调用:

  • Range(8, 8 << 10) 表示从8开始,每次乘以8,直到8192,这个对应上面的state.range(0),会把这个数作为参数传递进去

  • BENCHMARK_MAIN表示使用google benchmark的main函数,我们知道每个可执行文件都有一个main,那这个文件可以执行的原因就在于,这个宏展开后就是main函数,你学会了吗?

// 定义基准测试
BENCHMARK(BM_vectorInsert)->Range(8, 8<<10);
BENCHMARK(BM_listInsert)->Range(8, 8<<10);

// 运行基准测试
BENCHMARK_MAIN();

3.总结

本节Step by Step带大家学习google benchmark,并将其应用到我们自己的项目中,你可以在里面做很多有趣的事情,本节源码放入知识星球当中供大家学习,欢迎加入一起交流~

2e0f2901e0d2a67ad251d6c1f13d2782.jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/6276.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

灵动微基于 MM32SPIN040C 为主控的无感方波水泵应用方案

水泵是一种运输液体或增压液体的机器。将原动机的机械能或其他外部动能量传递给液体&#xff0c;提高液体动能&#xff0c;主要用于运输含水、油、酸碱液、乳化液、悬乳液和液体金属的液体。 介绍一款适用于水泵的32位单片机——MM32SPIN040C。 RAMSUN推荐一款应用于水泵的MC…

从零开始实现一个C++高性能服务器框架----协程调度模块

此项目是根据sylar框架实现&#xff0c;是从零开始重写sylar&#xff0c;也是对sylar丰富与完善 项目地址&#xff1a;https://gitee.com/lzhiqiang1999/server-framework 简介 项目介绍&#xff1a;实现了一个基于协程的服务器框架&#xff0c;支持多线程、多协程协同调度&am…

倒计时组件:可视化如何自定义目标时间 / 数字倒数

倒计时组件支持通过自定义目标时间或倒数数字&#xff0c;在报表和大屏中展示时间倒数和数字倒数。 下面以Sugar BI为例&#xff0c;为大家展示 倒计时展示模式 倒计时组件提供「时间倒数」和「数字倒数」两种展示模式&#xff0c;效果如下&#xff1a; 默认为「时间倒数」模…

将本地项目上传到远程仓库的步骤

文章目录将本地项目上传到远程仓库的步骤1.进入想上传的项目文件夹2.初始化本地仓库3.添加该项目下的所有文件4.将文件添加到本地仓库中5.添加远程仓库6.将文件更新到远程仓库上7.将本地文件推送回到指定的远程仓库中将本地项目上传到远程仓库的步骤 1.进入想上传的项目文件夹…

简单介绍TensorFlow中关于tf.app.flags命令行参数解析模块

这篇文章主要介绍了TensorFlow中关于tf.app.flags命令行参数解析模块&#xff0c;具有很好的参考价值&#xff0c;希望对大家有所帮助。如有错误或未考虑完全的地方&#xff0c;望不吝赐教 tf.app.flags命令行参数解析模块 说道命令行参数解析&#xff0c;就不得不提到 python…

Spring的IOC和DI入门

1、相关概念 1.1、Spring来源 官网&#xff1a;Spring | Home Spring是一个分层的Java SE/EE应用一站式的轻量级开源框架。Spring核心是IOC和AOP。 Spring主要优点包括&#xff1a; 方便解耦&#xff0c;简化开发&#xff0c;通过Spring提供的IoC容器&#xff0c;我们可以将…

分布式事务问题

分布式事务问题 1、什么是分布式事务 一次课程发布操作需要向数据库、redis、elasticsearch、MinIO写四份数据&#xff0c;这里存在分布式事务问题。 什么是分布式事务&#xff1f; 首先理解什么是本地事务&#xff1f; 平常我们在程序中通过spring去控制事务是利用数据库…

【C++】一维数组练习案例 - 五只小猪称体重

目录 1、缘起 2、案例描述 3、代码 4、总结 1、缘起 最近在黑马程序员 UP 主那里学习 C 编程语言&#xff0c;学习到了【第44节】一维数组练习案例 - 五只小猪称体重 知识点。找出五只小猪中最重的小猪&#xff0c;这不就是基本算法中的 "求最大值算法" 嘛。 为…

ChatGPT相关核心算法

ChatGPT 的卓越表现得益于其背后多项核心算法的支持和配合。本文将分别介绍作为其实现基础的 Transformer 模型、激发出其所蕴含知识的Prompt/Instruction Tuning 算法、其涌现出的思维链能力、以及确保其与人类意图对齐的基于人类反馈的强化学习算法。 1.基于Transformer的预…

STM32F4_时钟系统精讲

目录 1. 什么是系统时钟 2. 时钟树 2.1 LSI 2.2 LSE 2.3 HSI 2.4 HSE 2.5 PLLCLK 2.6 SYSCLK 2.7 HCLK 2.8 PCLK1 2.9 PCLK2 2.10 RTC/AWU 3 SysTick定时器 3.1 为什么会有Systick定时器&#xff1f; 3.2 SysTick定时器的作用 3.3 SysTick定时器的寄存器 4.…

DAMA-CDGA/CDGP数据治理认证考试地点一般有哪些?

据目前数据统计&#xff0c;进行过DAMA-CDGA/CDGP数据治理认证考试的地区主要是一线城市及直辖市&#xff0c;主要有&#xff1a;北京、上海、广州、深圳、西安、杭州、成都、重庆、武汉、厦门、太原、甘肃、长沙等。&#xff08;*当所在城市报名人数达到25人以上方可增加考场开…

C++基本语法

C 程序可以定义为对象的集合&#xff0c;这些对象通过调用彼此的方法进行交互。现在让我们简要地看一下什么是类、对象&#xff0c;方法、即时变量。 对象 - 对象具有状态和行为。例如&#xff1a;一只狗的状态 - 颜色、名称、品种&#xff0c;行为 - 摇动、叫唤、吃。对象是类…

SpringBoot2基础入门 --- 了解自动配置原理

一、SpringBoot特点 1.1、依赖管理 父项目做依赖管理 依赖管理 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.4.RELEASE</version> </parent>…

固定资产AFAB进行折旧选择页面的各个选项分别是什么意思?

固定资产AFAB进行折旧选择页面的“记账运行原因”的4个选项&#xff0c;及下面的各个选项分别是什么意思&#xff1f; 一、“记账运行原因”的4个选项&#xff1a; 1&#xff0c;计划内记账运行&#xff08;Planned posting run&#xff09;&#xff1a;上期折旧成功运行&…

测试---

1.加载测试专用属性 1.在启动测试环境时可以通过properties参数设置测试环境专用的属性 SpringBootTest(properties {"test.valuekllda"}) public class PropertiesTest {Value("${test.value}")private String msg; ​Testpublic void testPro(){System…

初识MQ——springCloud

目录 同步通讯 同步调用存在的问题 优点 异步通讯 优势 缺点 MQ常见框架 同步通讯 同步调用存在的问题 1、耦合度高 2、性能下降 3、资源浪费 4、级联失败 优点 时效性强 &#xff0c;可以立即得到结果 异步通讯 异步调用常见实现就是事件驱动模式 优势 1、解除耦合 2、…

【关于Linux中----多线程(一)】

文章目录认识线程创建线程线程优点和缺点创建一批线程终止线程线程的等待问题认识线程 在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;。更准确的定义是&#xff1a;线程是“一个进程内部的控制序列”一切进程至少都有一个执行线程线程在进程内部运行&a…

高通开发系列 - linux kernel内核升级msm-4.9升级至msm-4.19(1)

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 报错和警告问题中断警告的解决方案Unknown SOC ID问题解决方法msm-vidc panic错误系统时钟功能RPM功能调试共享内存smem调试之前移植过…

SpringCloud Alibaba Nacos

文章目录第一章 SpringCloud Alibaba1.1概述1.2 主要功能1.3 组件第二章 SpringCloud Alibaba Nacos服务注册与配置中心2.1 Nacos简介2.2 安装Nacos2.3 Nacos作为服务注册中心一、服务提供者二、服务消费者三、服务注册中心对比2.4 Nacos作为服务配置中心一、Nacos基础配置项目…

【C++笔试强训】第六天

选择题 1. 解析&#xff1a;十进制转换为八进制就是不断的除8&#xff0c;取余数。十进制转换成其他进制的数就是除以进制&#xff0c;取余。 解析&#xff1a;注意printf的转换&#xff0c;%%只会打印一个%&#xff0c;所以选A。 解析&#xff1a;由于()的原因p先和*结合&…