benchmark::State benchmark 原理

benchmark::State

benchmark::State是Google Benchmark库中的一个核心类,用于管理单个基准测试的状态信息和控制基准测试的执行流程。在编写基准测试时,这个类提供了一套丰富的接口,允许用户获取测试循环的次数、调整测试参数、测量时间等,从而使基准测试既灵活又准确。以下是benchmark::State的一些主要用途和功能:

1. 控制测试循环

在基准测试中,通常需要重复执行某项操作多次以获得可靠的测量结果。benchmark::State通过一个迭代器来控制这个测试循环。例如:

for (auto _ : state) {// 需要测试性能的代码
}

这里的循环会自动根据测试的需要重复执行,直到Google Benchmark认为已经收集到足够的数据为止。

2. 测量时间

默认情况下,Google Benchmark会自动测量每次迭代的时间。然而,有时候我们可能需要排除一些准备工作的时间。此时,可以使用state.PauseTiming()state.ResumeTiming()来暂停和恢复计时:

for (auto _ : state) {state.PauseTiming();// 不需要计入时间的准备工作state.ResumeTiming();// 被测量的代码
}

3. 自定义指标

除了时间,你还可以通过state.counters来报告其他自定义指标。例如:

for (auto _ : state) {// 测试代码state.counters["MyMetric"] = 1.23; // 设置自定义指标
}

4. 处理参数化测试

当你使用参数化的基准测试时,可以通过state.range(0)等方法来获取测试参数的值,这对于执行需要不同输入大小的测试非常有用。

static void BM_SomeFunction(benchmark::State& state) {int input = state.range(0);for (auto _ : state) {// 使用input作为输入的测试代码}
}
BENCHMARK(BM_SomeFunction)->Arg(8)->Arg(64)->Arg(512); // 参数化测试

原理

C++中的基准测试(Benchmarking)主要是衡量某段代码或程序在特定条件下的性能表现,如执行时间、内存使用、CPU周期等。Google Benchmark是C++中常用的一个基准测试库,其原理和实现方式代表了C++基准测试的典型做法。以下是C++基准测试的一般原理和关键概念:

1. 重复执行:

基准测试通过重复执行被测代码多次来获得一个平均值,以减少测试结果的误差。由于操作系统和硬件的复杂性,单次执行的时间可能会受到很多因素的影响,重复执行可以帮助平滑这些随机波动。

2. 自动调整迭代次数:

为了确保测试结果的准确性,Google Benchmark等库会自动调整每个测试循环的迭代次数。库会根据前几次迭代的执行时间动态调整,以确保总的测试时间既不会太长,也足以获得稳定的性能数据。

3. 避免优化:

编译器的优化可能会改变代码的执行方式,甚至完全移除某些看似“无用”的代码。为了防止这种情况,基准测试库提供了特定的机制来“欺骗”编译器,防止它过度优化。例如,使用volatile关键字或者通过某些方法将结果输出到黑盒(black hole)函数。

4. 精确计时:

基准测试需要非常精确地测量时间。这通常通过使用操作系统提供的高精度计时器实现,如Linux上的clock_gettime或Windows上的QueryPerformanceCounter

5. 统计分析:

简单的平均值可能不足以反映真实的性能表现,因此高级的基准测试工具还会提供更多统计数据,如中位数、标准差等,以及运行结果的置信区间。这有助于更全面地了解性能特性。

6. 参数化测试:

对于需要测试不同输入或条件下性能的情况,基准测试库允许参数化测试,即同一段代码可以自动应用多组参数进行测试,方便评估在不同条件下的性能差异。

7. 隔离和控制:

为了确保测试结果的稳定和可比较,基准测试尽可能在隔离的环境下运行,并控制外部变量的干扰,如尝试禁用系统的动态频率调整等。

实现概览:

  • 测试循环: 通过编写特定的测试函数,并在函数体内使用循环,让Google Benchmark等库控制循环次数。
  • 计时和控制: 使用库提供的API进行精确计时,暂停计时(在准备阶段),以及恢复计时(在测试阶段)。
  • 结果报告: 最后,基凊测试库会收集所有迭代的执行时间,计算并报告最终的性能指标。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P9 【力扣+知识点】【算法】【二分查找】C++版

【704】二分查找(模板题)看到复杂度logN,得想到二分 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标&#xff0…

企业微信hook接口协议,ipad协议http,语音转文字

语音转文字 参数名必选类型说明uuid是String每个实例的唯一标识,根据uuid操作具体企业微信msgid是int要转文字的语音消息id 请求示例 {"uuid":"a4ea6a39-4b3a-4098-a250-2a07bef57355","msgid":1063645 } 返回示例 {"data&…

电源模块测试系统怎么测试输入电压范围?

在现代电子设备中,电源模块的性能直接影响着整个系统的稳定性和效率。其中,电源输入电压范围是指电源能够接受的输入电压的最小值和最大值,它是确保电源正常工作的重要参数。为了提高测试效率和精度,自动化的测试方法逐渐取代了传…

【Game】Rumble Heroes

文章目录 1 英雄2 守护兽3 符文4 祝福5 阵容推荐6 Boss7 兑换码 1 英雄 (1)力量 神话英雄 圣骑士-乌瑟尔 传说英雄 双刀-宫本武藏死亡骑士-阿萨斯冰霜骑士-亚瑟疾风焰刃-缘壹熊猫武僧-阿宝 史诗英雄 大剑-克劳德狂战士-奎托斯魔山-克里刚猎人-奈辛瓦里 稀…

宝塔部署Java+Vue前后端分离项目

1. 服务器 服务器选择Linux的CentOS7的版本 2. 宝塔Linux面板 2.1 百度搜索宝塔 2.2 进去之后点击立即免费安装 2.3 选择Linux在线安装,输入服务器信息进行安装(也可以选择其他方式) 安装完成之后会弹一个宝塔的应用面板,并附带有登录名称和密码&…

多模态大模型:系统、趋势与问题

引言 多模态大模型是当今人工智能领域的热门方向之一。它不仅能处理文本,还能理解和生成图像、视频、语音等多种模态的数据。这种能力使得多模态大模型在自然语言处理、计算机视觉等多个领域展示出巨大的潜力和应用价值。那么,多模态大模型是如何训练出…

AI菜鸟向前飞 — LangChain系列之十五 - Agent系列:从现象看机制(中篇)一个Agent的“旅行”

Agent基本架构 先谈谈Agent基本架构概念,如果看得云里雾里,等看完本篇之后,再回头看就会豁然开朗的,而我尽量写得更易懂: ) 这里面会穿插着上一篇的内容,请大家记得往回翻翻,传送门&…

MySQL 慢查询优化指南

MySQL 慢查询优化指南 在现代数据库管理中,性能优化是一个不可忽视的重要环节。尤其是对于高并发、大数据量的应用,慢查询可能会成为系统的性能瓶颈。本文将介绍如何查看和优化 MySQL 的慢查询,帮助你提高数据库性能。 一、什么是慢查询&am…

C语言 | Leetcode C语言题解之第118题杨辉三角

题目&#xff1a; 题解&#xff1a; int** generate(int numRows, int* returnSize, int** returnColumnSizes) {int** ret malloc(sizeof(int*) * numRows);*returnSize numRows;*returnColumnSizes malloc(sizeof(int) * numRows);for (int i 0; i < numRows; i) {re…

C#实现计算数据和刷新ListView列表并发执行

下面是一个示例代码&#xff0c;演示如何在C#中实现计算列表的数据和刷新ListView控件的数据的并发执行&#xff1a; using System; using System.Collections.Generic; using System.Threading; using System.Windows.Forms;class Program {static List<int> dataList …

前端API: IntersectionObserver的那一二三件事

IntersectionObserver 基础 IntersectionObserver 可以监听一个元素和可视区域相交部分的比例&#xff0c;然后在可视比例达到某个阈值的时候触发回调。比如可以用来处理图片的懒加载等等 首先我们来看下基本的格式&#xff1a; const observer new IntersectionObserver(c…

yolov10 使用自己的数据集训练目标检测模型

1 环境配置(使用anaconda) conda create -n yolov10 python=3.9 //创建虚拟环境 conda activate yolov10 //激活虚拟环境 pip install -r requirements.txt //执行yolov10 路径下requirements.txt 安装依赖 pip install -e .2.数据集制作 使用lableImage制作数据集(win版…

华为云Astro Zero低代码平台案例:小、轻、快、准助力销售作战数字化经营

客户背景&#xff1a; 随着业务的不断扩展&#xff0c;华为云某一线作战团队发现&#xff0c;原本基于线上Excel的项目跟踪方式面临新的挑战&#xff1a;多区域、多场景下的业务管理越来越复杂&#xff0c;项目管道存在多种不可控因素&#xff0c;客户关系、进展跟踪同步不及时…

【Qt秘籍】[003]-Qt环境变量配置-磨刀不误砍柴工

一、为什么要设置环境变量 &#xff1f;[原因] 配置PATH环境变量的主要用处在于让操作系统能够识别并执行不在当前工作目录下的可执行文件。具体来说&#xff0c;它的作用包括&#xff1a; 命令执行便捷性&#xff1a;当你在命令行输入一个命令&#xff08;如java, python或np…

【Unity程序】Unity游戏开发中常用的设计模式【一】

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

【C语言习题】26.字符逆序

文章目录 1.描述2.解题思路3.具体代码 1.描述 输入描述: 将一个字符串str的内容颠倒过来&#xff0c;并输出。可以有空格 数据范围&#xff1a;1≤&#x1d459;&#x1d452;&#x1d45b;(&#x1d460;&#x1d461;&#x1d45f;)≤10000 1≤len(str)≤10000 输出描述&…

Android基础-数据库

在Android系统中&#xff0c;数据库扮演着至关重要的角色&#xff0c;它负责存储、管理和检索应用程序所需的数据。随着移动应用的日益复杂和功能的不断增加&#xff0c;对数据库的需求也日益提高。在Android中&#xff0c;有多种数据库管理系统和工具可供选择&#xff0c;其中…

NDIS协议驱动(四)

NDIS 定义对象标识符 (OID) 值&#xff0c;以标识适配器参数&#xff0c;其中包括设备特征、可配置设置和统计信息等操作参数。 协议驱动程序可以查询或设置基础驱动程序的操作参数。 NDIS 还为 NDIS 6.1 及更高版本的协议驱动程序提供直接 OID 请求接口。 直接 OID 请求路径支…

利用EasyCVR视频智能监控技术,构建智慧化考场监管体系

随着科技的进步&#xff0c;视频监控在各个领域的应用越来越广泛&#xff0c;其中在考场中的应用尤为显著。视频监控不仅能够提高考场的监管水平&#xff0c;确保考试的公平、公正和公开&#xff0c;还能有效预防和打击作弊行为&#xff0c;为考生营造一个良好的考试环境。 传…

前后端分离跨域问题解决方案

Vue和SpringBoot的跨域问题的4中解决方案 跨域问题产生的原因&#xff1a;浏览器的保护机制&#xff0c;同源策略协议&#xff0c;域名&#xff0c;端口&#xff1b;三个中有一个不同就会产生跨域问题 解决方案&#xff08;后端&#xff09;&#xff1a; 1.CrossOrigin注解&…