C++性能測(cè)試工具:google benchmark入門(mén)

如果你正在尋找一款c++性能測(cè)試工具,那么這篇文章是不容錯(cuò)過(guò)的。

市面上的benchmark工具或多或少存在一些使用上的不便,那么是否存在一個(gè)使用簡(jiǎn)便又功能強(qiáng)大的性能測(cè)試工具呢?答案是google/benchmark坐桩。

google/benchmark是一個(gè)由Google開(kāi)發(fā)的基于googletest框架的c++ benchmark工具,它易于安裝和使用封锉,并提供了全面的性能測(cè)試接口绵跷。

下面我將介紹google/benchmark的安裝并用一個(gè)簡(jiǎn)短的例子介紹它的簡(jiǎn)單使用膘螟。

安裝google/benchmark

google/benchmark基于c++11標(biāo)準(zhǔn)和googletest框架,所以安裝前需要先做一些準(zhǔn)備工作碾局。

首先是安裝g++和cmake荆残。

Debian/Ubuntu:

sudo apt install g++ cmake

Arch Linux/Manjaro Linux:

sudo pacman -s g++ cmake

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

小編是一個(gè)有著6年工作經(jīng)驗(yàn)的工程師内斯,關(guān)于C++,編程像啼,自己有做材料的整合俘闯,一個(gè)完整的C++編程學(xué)習(xí)路線(xiàn),學(xué)習(xí)資料和工具忽冻,能夠進(jìn)我的群7253真朗,-91790收取,免費(fèi)送給大家僧诚,希望你也能憑著自己的努力遮婶,成為下一個(gè)優(yōu)秀的程序員

然后是googletest框架,你可以選擇單獨(dú)安裝湖笨,不過(guò)這里我選擇將其作為benchmark源碼樹(shù)的依賴(lài)而不單獨(dú)安裝它旗扑,因?yàn)閎enchmark在編譯安裝時(shí)需要googletest但是在使用時(shí)并不需要,為了篇幅我們選擇后者慈省。

準(zhǔn)備工作完成后選擇一個(gè)合適的目錄臀防,然后運(yùn)行下面的命令:

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

# 如果想全局安裝就接著運(yùn)行下面的命令

sudo make install

頭文件會(huì)被安裝至/usr/local/include,庫(kù)文件會(huì)安裝至/usr/local/lib辫呻。

現(xiàn)在安裝完成了,我們來(lái)看看benchmark如何使用琼锋。

google/benchmark的簡(jiǎn)單使用

我們的例子將會(huì)對(duì)比三種訪(fǎng)問(wèn)std::array容器內(nèi)元素方法的性能放闺,進(jìn)而演示benchmark的使用方法。

先看代碼:

#include <benchmark/benchmark.h>

#include <array>

constexpr int len = 6;

// constexpr function具有inline屬性缕坎,你應(yīng)該把它放在頭文件中

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)是一個(gè)constexpr function谜叹,它會(huì)返回容器內(nèi)元素的引用匾寝,并在編譯期檢查數(shù)組的索引是否正確

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();

我們可以看到每一個(gè)benchmark測(cè)試用例都是一個(gè)類(lèi)型為std::function<void(benchmark::State&)>的函數(shù),其中benchmark::State&負(fù)責(zé)測(cè)試的運(yùn)行及額外參數(shù)的傳遞荷腊。

隨后我們使用for (auto _: state) {}來(lái)運(yùn)行需要測(cè)試的內(nèi)容艳悔,state會(huì)選擇合適的次數(shù)來(lái)運(yùn)行循環(huán),時(shí)間的計(jì)算從循環(huán)內(nèi)的語(yǔ)句開(kāi)始女仰,所以我們可以選擇像例子中一樣在for循環(huán)之外初始化測(cè)試環(huán)境猜年,然后在循環(huán)體內(nèi)編寫(xiě)需要測(cè)試的代碼抡锈。

測(cè)試用例編寫(xiě)完成后我們需要使用BENCHMARK(<function_name>);將我們的測(cè)試用例注冊(cè)進(jìn)benchmark,這樣程序運(yùn)行時(shí)才會(huì)執(zhí)行我們的測(cè)試乔外。

最后是用BENCHMARK_MAIN();替代直接編寫(xiě)的main函數(shù)床三,它會(huì)處理命令行參數(shù)并運(yùn)行所有注冊(cè)過(guò)的測(cè)試用例生成測(cè)試結(jié)果。

示例中大量使用了constexpt杨幼,這是為了能在編譯期計(jì)算出需要的數(shù)值避免對(duì)測(cè)試產(chǎn)生太多噪音撇簿。

然后我們編譯測(cè)試程序:

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

benchmark需要鏈接libbenchmark.so,所以需要指定-lbenchmark差购,此外還需要thread的支持四瘫,因?yàn)閘ibstdc++不提供thread的底層實(shí)現(xiàn),我們需要pthread歹撒。另外不建議使用-lpthread莲组,官方表示會(huì)出現(xiàn)兼容問(wèn)題,在我這測(cè)試也會(huì)出現(xiàn)鏈接錯(cuò)誤暖夭。

編譯好程序后就可以運(yùn)行測(cè)試了:

顯示的警告信息表示在當(dāng)前系統(tǒng)環(huán)境有一些噪音(例如其他在運(yùn)行的程序)可能導(dǎo)致結(jié)果不太準(zhǔn)確锹杈,并不影響我們的測(cè)試。

測(cè)試結(jié)果與預(yù)期基本相符迈着,std::get最快竭望,at()最慢。

以上就是google/benchmark的安裝和簡(jiǎn)單使用裕菠,

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末咬清,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子奴潘,更是在濱河造成了極大的恐慌旧烧,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件画髓,死亡現(xiàn)場(chǎng)離奇詭異掘剪,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)奈虾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)夺谁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人肉微,你說(shuō)我怎么就攤上這事匾鸥。” “怎么了碉纳?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵勿负,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我劳曹,道長(zhǎng)笆环,這世上最難降的妖魔是什么攒至? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮躁劣,結(jié)果婚禮上迫吐,老公的妹妹穿的比我還像新娘。我一直安慰自己账忘,他們只是感情好志膀,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著鳖擒,像睡著了一般溉浙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蒋荚,一...
    開(kāi)封第一講書(shū)人閱讀 51,462評(píng)論 1 302
  • 那天戳稽,我揣著相機(jī)與錄音,去河邊找鬼期升。 笑死惊奇,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的播赁。 我是一名探鬼主播颂郎,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼容为!你這毒婦竟也來(lái)了乓序?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤坎背,失蹤者是張志新(化名)和其女友劉穎替劈,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體得滤,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡陨献,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了耿戚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片湿故。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡阿趁,死狀恐怖膜蛔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情脖阵,我是刑警寧澤皂股,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站命黔,受9級(jí)特大地震影響呜呐,放射性物質(zhì)發(fā)生泄漏就斤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一蘑辑、第九天 我趴在偏房一處隱蔽的房頂上張望洋机。 院中可真熱鬧,春花似錦洋魂、人聲如沸绷旗。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)衔肢。三九已至,卻和暖如春豁翎,著一層夾襖步出監(jiān)牢的瞬間角骤,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工心剥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留邦尊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓刘陶,卻偏偏與公主長(zhǎng)得像胳赌,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子匙隔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容