Google Benchmark性能測試

Google Benchmark性能測試

Google Benchmark 是一個用于 C++ 的微基準測試框架,專為測量小塊代碼的性能而設計。它提供了一種簡單而強大的方式來編寫、運行和分析基準測試,幫助開發人員識別性能瓶頸并優化代碼。本教程將從安裝和基本用法開始,逐步深入到高級功能,并通過 C++ 示例演示如何結合測試實踐。


1. 安裝 Google Benchmark

在 Ubuntu 上安裝 Google Benchmark 非常簡單。以下是安裝步驟:

  1. 更新軟件包列表

    sudo apt-get update
    
  2. 安裝 Google Benchmark

    sudo apt-get install libbenchmark-dev
    
  3. 驗證安裝
    安裝完成后,你可以通過編譯一個簡單的基準測試程序來驗證安裝是否成功。


2. 基本用法

Google Benchmark 的基本用法是定義一個基準測試函數,并使用 BENCHMARK 宏注冊它。以下是一個簡單的示例:

示例 1:測量函數執行時間

代碼
#include <benchmark/benchmark.h>
#include <chrono>
#include <thread>void BM_Sleep(benchmark::State& state) {for (auto _ : state) {std::this_thread::sleep_for(std::chrono::milliseconds(100));}
}BENCHMARK(BM_Sleep);BENCHMARK_MAIN();
編譯和運行
  1. 編譯

    g++ -std=c++11 -O2 -o benchmark_example benchmark_example.cpp -lbenchmark -lpthread
    
    • -lbenchmark 鏈接 Google Benchmark 庫。
    • -lpthread 鏈接 pthread 庫(Google Benchmark 依賴)。
  2. 運行

    ./benchmark_example
    
輸出分析

運行后,你將看到類似以下的輸出:

2023-10-01 12:00:00
Running ./benchmark_example
Run on (8 X 4200 MHz CPU s)
CPU Caches:L1 Data 32 KiB (x4)L1 Instruction 32 KiB (x4)L2 Unified 256 KiB (x4)L3 Unified 8192 KiB (x1)
***WARNING*** CPU scaling is enabled, the benchmark real time measurements may be noisy and will incur extra overhead.
---------------------------------------------------------
Benchmark               Time             CPU   Iterations
---------------------------------------------------------
BM_Sleep         100000000 ns    100000000 ns           7
  • Time:每次迭代的平均時間。
  • CPU:每次迭代的 CPU 時間。
  • Iterations:基準測試運行的迭代次數。

示例 2:測量不同參數下的性能

Google Benchmark 允許你通過 RangeArgs 指定參數,測試不同輸入下的性能。

代碼
#include <benchmark/benchmark.h>
#include <vector>void BM_VectorPushBack(benchmark::State& state) {for (auto _ : state) {std::vector<int> v;for (int i = 0; i < state.range(0); ++i) {v.push_back(i);}}
}BENCHMARK(BM_VectorPushBack)->Range(8, 8<<10);BENCHMARK_MAIN();
編譯和運行
  1. 編譯

    g++ -std=c++11 -O2 -o benchmark_range benchmark_range.cpp -lbenchmark -lpthread
    
  2. 運行

    ./benchmark_range
    
輸出分析

輸出將顯示不同 vector 大小下的性能:

---------------------------------------------------------
Benchmark               Time             CPU   Iterations
---------------------------------------------------------
BM_VectorPushBack/8          10 ns          10 ns    10000000
BM_VectorPushBack/64         80 ns          80 ns     1000000
BM_VectorPushBack/512       640 ns         640 ns      100000
BM_VectorPushBack/4096     5120 ns        5120 ns       10000
BM_VectorPushBack/32768   40960 ns       40960 ns        1000

這表明隨著 vector 大小的增加,push_back 操作的耗時也相應增加。


3. 高級功能

Google Benchmark 還提供了一些高級功能,幫助你更精細地控制基準測試。

3.1 自定義計時

你可以使用 DoNotOptimizeClobberMemory 來防止編譯器優化掉你的代碼。

代碼
#include <benchmark/benchmark.h>void BM_CustomTiming(benchmark::State& state) {for (auto _ : state) {int result = 0;for (int i = 0; i < 1000; ++i) {result += i;}benchmark::DoNotOptimize(result);benchmark::ClobberMemory();}
}BENCHMARK(BM_CustomTiming);BENCHMARK_MAIN();
  • DoNotOptimize:防止編譯器優化掉 result
  • ClobberMemory:確保內存操作不被優化。

3.2 測量內存使用

Google Benchmark 允許你測量內存使用情況。

代碼
#include <benchmark/benchmark.h>
#include <vector>void BM_MemoryUsage(benchmark::State& state) {for (auto _ : state) {std::vector<int> v(state.range(0), 0);benchmark::DoNotOptimize(v.data());}state.SetBytesProcessed(state.iterations() * state.range(0) * sizeof(int));
}BENCHMARK(BM_MemoryUsage)->Range(8, 8<<10);BENCHMARK_MAIN();
  • SetBytesProcessed:設置每次迭代處理的字節數,用于計算吞吐量。

3.3 多線程基準測試

你可以使用 Threads 指定線程數,測試多線程環境下的性能。

代碼
#include <benchmark/benchmark.h>
#include <atomic>std::atomic<int> counter(0);void BM_AtomicIncrement(benchmark::State& state) {for (auto _ : state) {counter++;}
}BENCHMARK(BM_AtomicIncrement)->Threads(4);BENCHMARK_MAIN();
  • Threads(4):在 4 個線程中運行基準測試。

4. 結合測試實踐

在實際開發中,基準測試應與單元測試和性能分析工具結合使用,以確保代碼的正確性和高效性。

4.1 與單元測試集成

你可以在 CI/CD 管道中運行基準測試,監控性能變化。

4.2 與性能分析工具結合

使用 perfValgrind 等工具,深入分析基準測試結果,定位瓶頸。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/75642.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/75642.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/75642.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深度剖析:域名與DNS安全的全方位解讀

導語 在互聯網的龐大體系中,域名如同我們訪問網絡資源的“門牌號”,而DNS則像是將門牌號翻譯為具體地址的“翻譯官”。然而,這看似平常的域名與DNS系統,卻面臨著諸多安全風險。一旦遭受攻擊,可能導致網站無法訪問、用戶數據泄露等嚴重后果。了解域名與DNS安全知識,對保障…

CSS 的可繼承性

在面試中回答關于CSS可繼承性的問題時&#xff0c;建議采用結構化、清晰且簡潔的方式&#xff0c;展示你對這一概念的理解以及實際應用能力。以下是一個參考回答模板&#xff1a; 1. 定義和概念 “CSS的可繼承性是指某些CSS屬性可以被子元素自動繼承的特性。也就是說&#xf…

string 的接口

我們繼續來講解一些常用的string接口。 一.at接口 我們來看一個越界的問題。 我們運行之后發現這是一個斷言錯誤&#xff0c;直接就終止我們的程序了&#xff0c;不能作為異常被捕捉到&#xff0c;但是我們如果不想讓程序直接崩潰該怎么辦呢&#xff1f; 此時我們就要用到at關鍵…

DeepSeek調用API訪問,使用AnythingLLM建立本地知識庫后開放API調用,ApiFox/PostMan調用本地DeepSeek

上篇文章中我們使用AnythingLLM成功在本地部署了DeepSeek的本地知識庫&#xff0c;并且上傳了幾個文件讓DeepSeek學習&#xff0c;可點擊查看&#xff1a; 本地部署DeepSeek并使用AnythingLLM建立本地知識庫全流程&#xff0c;DeepSeek-R1:7b本地安裝部署,DeepSeek-R1本地部署…

創新NDT解決方案:XARION激光超聲系統助力航空航天材料的高效監測

XARION激光超聲檢測系統是一種高效的無損檢測工具&#xff0c;它利用激光技術產生超聲波信號&#xff0c;并通過無膜光學麥克風捕捉這些信號&#xff0c;提供非接觸式的超聲檢測解決方案。該系統適用于多種材料和復雜表面的檢測&#xff0c;滿足工業、醫療和科研領域的嚴格標準…

基于 PHP 內置類及函數的免殺 WebShell

前言 PHP 作為廣泛使用的服務端語言&#xff0c;其靈活的內置類&#xff08;如 DOMDocument&#xff09;和文件操作機制&#xff08;.ini、.inc 的自動加載&#xff09;&#xff0c;為攻擊者提供了天然的隱蔽通道。通過 動態函數拼接、反射調用、加密混淆 和 偽命名空間 等手法…

Arduino、ESP32驅動BME688環境傳感器(環境傳感器篇)

目錄 1、傳感器特性 2、硬件原理圖 3、控制器和傳感器連線圖 4、驅動程序 4.1、讀取數據(無IAQ指數) 4.2、讀取數據(帶IAQ數值) BME688環境傳感器是一款四合一MEMS環境傳感器,可測量VOC(揮發性有機物)、溫度、濕度、氣壓這四個參數,非常適用于監測空氣質量。由于…

數據結構——順序棧seq_stack

前言&#xff1a;大家好&#x1f60d;&#xff0c;本文主要介紹了數據結構——順序棧 目錄 一、概念 1.1 順序棧的基本概念 1.2 順序棧的存儲結構 二、基本操作 2.1 結構體定義 2.2 初始化 2.3 判空 2.4 判滿 2.5 擴容 2.6 插入 入棧 2.7 刪除 出棧 2.8 獲取棧頂元…

C++20 中的std::c8rtomb和 std::mbrtoc8

文章目錄 1. 引言2. std::c8rtomb 函數詳解3. std::mbrtoc8 函數詳解4. 使用示例5. 注意事項6. 總結 1. 引言 C20 標準引入了對 UTF-8 編碼的更好支持&#xff0c;其中包括兩個重要的函數&#xff1a;std::c8rtomb 和 std::mbrtoc8。這兩個函數分別用于將 UTF-8 編碼的字符轉換…

AI音樂生成革命:解讀昆侖萬維Mureka O1的技術突破與應用實踐

AI音樂生成革命&#xff1a;解讀昆侖萬維Mureka O1的技術突破與應用實踐 全球音樂產業正經歷AI技術重塑&#xff0c;昆侖萬維最新發布的音樂推理大模型Mureka O1引發行業震動。本文深度解析其技術原理與實測表現&#xff0c;揭開AI音樂創作新紀元的技術密碼 一、技術演進&…

《Operating System Concepts》閱讀筆記:p483-p488

《Operating System Concepts》學習第 40 天&#xff0c;p483-p488 總結&#xff0c;總計 6 頁。 一、技術總結 1.object storage (1)object storage 管理軟件 Hadoop file system(HDFS)、Ceph。 二、英語總結(生詞&#xff1a;1) 1.commodity (1)commodity: com-(“tog…

強化學習與神經網絡結合(以 DQN 展開)

目錄 基于 PyTorch 實現簡單 DQN double DQN dueling DQN Noisy DQN&#xff1a;通過噪聲層實現探索&#xff0c;替代 ε- 貪心策略 Rainbow_DQN如何計算連續型的Actions 強化學習中&#xff0c;智能體&#xff08;Agent&#xff09;通過與環境交互學習最優策略。當狀態空間或動…

“11.9元“引發的系統雪崩:Spring Boot中BigDecimal反序列化異常全鏈路狙擊戰 ?

&#x1f4a5; "11.9元"引發的系統雪崩&#xff1a;Spring Boot中BigDecimal反序列化異常全鏈路狙擊戰 &#x1f3af; &#x1f50d; 用 Mermaid原生防御體系圖 #mermaid-svg-XZtcYBnmHrF9bFjc {font-family:"trebuchet ms",verdana,arial,sans-serif;fon…

Cortex-M7進入異常中斷分析

使用cmbacktrace庫&#xff0c;其支持M3,4,7。 1、串口輸出異常信息 #define cmb_println(...) Debug_Printf(__VA_ARGS__)//cmb_println處理可變參數和格式化字符串 int Debug_Printf(const char *fmt, ...) {char buffer[DEBUG_TxBUFLEN];INT16U n;va_list args;va_star…

如何管理間接需求?團隊實踐分享

管理間接需求的核心方法包括明確需求識別流程、建立規范的需求管理體系、實施有效的需求溝通機制。 其中&#xff0c;明確需求識別流程最為關鍵。企業在實際業務中&#xff0c;往往會遇到大量的間接需求&#xff0c;如非直接生產性的采購需求、服務類需求等。這些需求往往隱蔽性…

與Aspose.pdf類似的jar庫分享

如果你在尋找類似于 Aspose.PDF 的 JAR 庫&#xff0c;這些庫通常用于處理 PDF 文檔的創建、編輯、轉換、合并等功能。以下是一些類似的 Java 庫&#xff0c;它們提供 PDF 處理的功能&#xff0c;其中一些是收費的&#xff0c;但也有開源選項&#xff1a; 1. iText (iText PDF…

2-2 MATLAB鮣魚優化算法ROA優化CNN超參數回歸預測

本博客來源于CSDN機器魚&#xff0c;未同意任何人轉載。 更多內容&#xff0c;歡迎點擊本專欄目錄&#xff0c;查看更多內容。 目錄 0.引言 1.ROA優化CNN 2.主程序調用 3.結語 0.引言 在博客【ROA優化LSTM超參數回歸】中&#xff0c;我們采用ROA對LSTM的學習率、迭代次數…

企業入駐成都國際數字影像產業園,可享150多項專業服務

企業入駐成都國際數字影像產業園&#xff0c;可享150多項專業服務 全方位賦能&#xff0c;助力影像企業騰飛 入駐成都國際數字影像產業園&#xff0c;企業將獲得一個涵蓋超過150項專業服務的全周期、一站式支持體系&#xff0c;旨在精準解決企業發展各階段的核心需求&#xf…

線路板元器件介紹及選型指南:提高電路設計效率

電路板&#xff08;PCB&#xff09;是現代電子設備的核心&#xff0c;其上安裝了各類電子元器件&#xff0c;這些元器件通過PCB的導電線路彼此連接&#xff0c;實現信號傳輸與功能執行。 元器件的選擇與安裝直接決定了電子產品的性能與穩定性。本文將為大家詳細介紹電路板上的…

探究 Arm Compiler for Embedded 6 的 Clang 版本

原創標題&#xff1a;Arm Compiler for Embedded 6 的 Clang 版本 原創作者&#xff1a;莊曉立&#xff08;LIIGO&#xff09; 原創日期&#xff1a;20250218&#xff08;首發日期20250326&#xff09; 原創連接&#xff1a;https://blog.csdn.net/liigo/article/details/14653…