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.pswp.cn/bicheng/18459.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/18459.shtml
英文地址,請注明出處:http://en.pswp.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注解&…