黑客集團(tuán)內(nèi)部運(yùn)作方式,跟銷售差不多烟号?

如果你正在尋找一款c++性能測試工具绊谭,那么這篇文章是不容錯過的。

市面上的benchmark工具或多或少存在一些使用上的不便汪拥,那么是否存在一個使用簡便又功能強(qiáng)大的性能測試工具呢达传?答案是google/benchmark。

google/benchmark是一個由Google開發(fā)的基于googletest框架的c++ benchmark工具迫筑,它易于安裝和使用宪赶,并提供了全面的性能測試接口。

下面我將介紹google/benchmark的安裝并用一個簡短的例子介紹它的簡單使用脯燃。

安裝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的某些特性邓厕。

然后是googletest框架,你可以選擇單獨(dú)安裝岛蚤,不過這里我選擇將其作為benchmark源碼樹的依賴而不單獨(dú)安裝它邑狸,因?yàn)閎enchmark在編譯安裝時需要googletest但是在使用時并不需要,為了篇幅我們選擇后者涤妒。

小編是一個有著6年工作經(jīng)驗(yàn)的工程師单雾,關(guān)于C++,編程她紫,自己有做材料的整合硅堆,一個完整的C++編程學(xué)習(xí)路線,學(xué)習(xí)資料和工具贿讹,能夠進(jìn)我的群7253渐逃,-91790收取,免費(fèi)送給大家民褂,希望你也能憑著自己的努力茄菊,成為下一個優(yōu)秀的程序員

準(zhǔn)備工作完成后選擇一個合適的目錄,然后運(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

頭文件會被安裝至/usr/local/include赊堪,庫文件會安裝至/usr/local/lib面殖。

現(xiàn)在安裝完成了,我們來看看benchmark如何使用哭廉。

google/benchmark的簡單使用

我們的例子將會對比三種訪問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)是一個constexpr function椿访,它會返回容器內(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();

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

隨后我們使用for (auto _: state) {}來運(yùn)行需要測試的內(nèi)容逛犹,state會選擇合適的次數(shù)來運(yùn)行循環(huán),時間的計(jì)算從循環(huán)內(nèi)的語句開始梁剔,所以我們可以選擇像例子中一樣在for循環(huán)之外初始化測試環(huán)境虽画,然后在循環(huán)體內(nèi)編寫需要測試的代碼。

測試用例編寫完成后我們需要使用BENCHMARK(<function_name>);將我們的測試用例注冊進(jìn)benchmark荣病,這樣程序運(yùn)行時才會執(zhí)行我們的測試码撰。

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

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

然后我們編譯測試程序:

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

benchmark需要鏈接libbenchmark.so,所以需要指定-lbenchmark柴梆,此外還需要thread的支持陨溅,因?yàn)閘ibstdc++不提供thread的底層實(shí)現(xiàn),我們需要pthread绍在。另外不建議使用-lpthread门扇,官方表示會出現(xiàn)兼容問題,在我這測試也會出現(xiàn)鏈接錯誤偿渡。

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

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

測試結(jié)果與預(yù)期基本相符溜宽,std::get最快吉拳,at()最慢。

以上就是google/benchmark的安裝和簡單使用适揉,

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末留攒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子嫉嘀,更是在濱河造成了極大的恐慌稼跳,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吃沪,死亡現(xiàn)場離奇詭異,居然都是意外死亡什猖,警方通過查閱死者的電腦和手機(jī)票彪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來不狮,“玉大人降铸,你說我怎么就攤上這事∫×悖” “怎么了推掸?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長驻仅。 經(jīng)常有香客問我谅畅,道長,這世上最難降的妖魔是什么噪服? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任毡泻,我火速辦了婚禮,結(jié)果婚禮上粘优,老公的妹妹穿的比我還像新娘仇味。我一直安慰自己呻顽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布丹墨。 她就那樣靜靜地躺著廊遍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪贩挣。 梳的紋絲不亂的頭發(fā)上喉前,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天疑故,我揣著相機(jī)與錄音译蒂,去河邊找鬼。 笑死铭若,一個胖子當(dāng)著我的面吹牛搪搏,可吹牛的內(nèi)容都是我干的狭握。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼疯溺,長吁一口氣:“原來是場噩夢啊……” “哼论颅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起囱嫩,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤恃疯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后墨闲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體今妄,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年鸳碧,在試婚紗的時候發(fā)現(xiàn)自己被綠了盾鳞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡瞻离,死狀恐怖腾仅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情套利,我是刑警寧澤推励,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站肉迫,受9級特大地震影響验辞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜喊衫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一受神、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧格侯,春花似錦鼻听、人聲如沸财著。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽撑教。三九已至,卻和暖如春醉拓,著一層夾襖步出監(jiān)牢的瞬間伟姐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工亿卤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留愤兵,地道東北人。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓排吴,卻偏偏與公主長得像秆乳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子钻哩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評論 2 355

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