最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談c++性能測(cè)試工具之計(jì)算時(shí)間復(fù)雜度

 更新時(shí)間:2021年06月03日 11:48:46   作者:apocelipes  
有時(shí)候除了測(cè)量算法的具體性能指數(shù),我們也會(huì)希望測(cè)試出算法的時(shí)間復(fù)雜度,以便我們對(duì)待測(cè)試的算法的性能有一個(gè)更加直觀的了解。本文將介紹c++性能測(cè)試工具之計(jì)算時(shí)間復(fù)雜度。

google benchmark已經(jīng)為我們提供了類似的功能,而且使用相當(dāng)簡單。

具體的解釋在后面,我們先來看幾個(gè)例子,我們?nèi)藶橹圃鞄讉€(gè)時(shí)間復(fù)雜度分別為O(n), O(logn), O(n^n)的測(cè)試用例:

// 這里都是為了演示而寫成的代碼,沒有什么實(shí)際意義
static void bench_N(benchmark::State& state)
{
    int n = 0;
    for ([[maybe_unused]] auto _ : state) {
        for (int i = 0; i < state.range(0); ++i) {
            benchmark::DoNotOptimize(n += 2); // 這個(gè)函數(shù)防止編譯器將表達(dá)式優(yōu)化,會(huì)略微降低一些性能
        }
    }
    state.SetComplexityN(state.range(0));
}
BENCHMARK(bench_N)->RangeMultiplier(10)->Range(10, 1000000)->Complexity();

static void bench_LogN(benchmark::State& state)
{
    int n = 0;
    for ([[maybe_unused]] auto _ : state) {
        for (int i = 1; i < state.range(0); i *= 2) {
            benchmark::DoNotOptimize(n += 2);
        }
    }
    state.SetComplexityN(state.range(0));
}
BENCHMARK(bench_LogN)->RangeMultiplier(10)->Range(10, 1000000)->Complexity();

static void bench_Square(benchmark::State& state)
{
    int n = 0;
    auto len = state.range(0);
    for ([[maybe_unused]] auto _ : state) {
        for (int64_t i = 1; i < len*len; ++i) {
            benchmark::DoNotOptimize(n += 2);
        }
    }
    state.SetComplexityN(len);
}
BENCHMARK(bench_Square)->RangeMultiplier(10)->Range(10, 100000)->Complexity();

如何傳遞參數(shù)和生成批量測(cè)試我們?cè)谏弦黄呀?jīng)介紹過了,這里不再重復(fù)。

需要關(guān)注的是新出現(xiàn)的state.SetComplexityN和Complexity。

首先是state.SetComplexityN,參數(shù)是一個(gè)64位整數(shù),用來表示算法總體需要處理的數(shù)據(jù)總量。benchmark會(huì)根據(jù)這個(gè)數(shù)值,再加上運(yùn)行耗時(shí)以及state的迭代次數(shù)計(jì)算出一個(gè)用于后面預(yù)估*均時(shí)間復(fù)雜度的值。

Complexity會(huì)根據(jù)同一組的多個(gè)測(cè)試用例計(jì)算出一個(gè)較接*的*均時(shí)間復(fù)雜度和一個(gè)均方根值,需要和state.SetComplexityN配合使用。

Complexity還有一個(gè)參數(shù),可以接受一個(gè)函數(shù)或是benchmark::BigO枚舉,它的作用是提示benchmark該測(cè)試用例的時(shí)間復(fù)雜度,默認(rèn)值為benchmark::oAuto,測(cè)試中會(huì)自動(dòng)幫我們計(jì)算出時(shí)間復(fù)雜度。對(duì)于較為復(fù)雜的算法,而我們又有預(yù)期的時(shí)間按復(fù)雜度,這時(shí)我們就可以將其傳給這個(gè)方法,比如對(duì)于第二個(gè)測(cè)試用例,我們還可以這樣寫:

static void bench_LogN(benchmark::State& state)
{
    // 中間部分與前面一樣,略過
}
BENCHMARK(bench_LogN)->RangeMultiplier(10)->Range(10, 1000000)->Complexity(benchmark::oLogN);

在選擇正確的提示后對(duì)測(cè)試結(jié)果幾乎沒有影響,除了偏差值可以降得更低,使結(jié)果更準(zhǔn)確。

Complexity在計(jì)算時(shí)間復(fù)雜度時(shí)會(huì)保留復(fù)雜度的系數(shù),因此,如果我們發(fā)現(xiàn)給出的提示的時(shí)間復(fù)雜度前的系數(shù)過大的話,就意味著我們的預(yù)估發(fā)生了較大的偏差,同時(shí)它還會(huì)計(jì)算出RMS值,同樣反應(yīng)了時(shí)間復(fù)雜度的偏差情況。

運(yùn)行我們的測(cè)試:

可以看到,自動(dòng)的時(shí)間復(fù)雜度計(jì)算基本是準(zhǔn)確的,可以在我們對(duì)算法進(jìn)行測(cè)試時(shí)提供一個(gè)有效的參考。

以上就是淺談c++性能測(cè)試工具之計(jì)算時(shí)間復(fù)雜度的詳細(xì)內(nèi)容,更多關(guān)于c++性能測(cè)試工具之計(jì)算時(shí)間復(fù)雜度的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 使用C語言實(shí)現(xiàn)12種排序方法

    使用C語言實(shí)現(xiàn)12種排序方法

    這篇文章主要介紹了用C語言完整實(shí)現(xiàn)12種排序方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 一文詳解C++ 智能指針的原理、分類及使用

    一文詳解C++ 智能指針的原理、分類及使用

    智能指針的本質(zhì)就是使用一個(gè)對(duì)象來接管一段開辟的空間,這篇文章就來給大家介紹介紹C++智能指針的原理,分類及使用方法,文中有詳細(xì)的代碼示例,需要的朋友可以參考下
    2023-05-05
  • C++基礎(chǔ)之this指針與另一種“多態(tài)”

    C++基礎(chǔ)之this指針與另一種“多態(tài)”

    this指針識(shí)別了同一個(gè)類的不同的對(duì)象,換句話說,this指針使得成員函數(shù)可以訪問同一個(gè)類的不同對(duì)象。再深入一點(diǎn),this指針使得成員函數(shù)會(huì)因?yàn)閠his指針的不同而訪問到了不同的成員變量
    2013-07-07
  • C++實(shí)例講解四種類型轉(zhuǎn)換的使用

    C++實(shí)例講解四種類型轉(zhuǎn)換的使用

    在C++語言中新增了四個(gè)關(guān)鍵字static_cast、const_cast、reinterpret_cast和dynamic_cast。這四個(gè)關(guān)鍵字都是用于類型轉(zhuǎn)換的,類型轉(zhuǎn)換(type cast),是高級(jí)語言的一個(gè)基本語法。它被實(shí)現(xiàn)為一個(gè)特殊的運(yùn)算符,以小括號(hào)內(nèi)加上類型名來表示,接下來讓我們一起來詳細(xì)了解
    2022-06-06
  • C++設(shè)置系統(tǒng)時(shí)間及系統(tǒng)時(shí)間網(wǎng)絡(luò)更新的方法

    C++設(shè)置系統(tǒng)時(shí)間及系統(tǒng)時(shí)間網(wǎng)絡(luò)更新的方法

    這篇文章主要介紹了C++設(shè)置系統(tǒng)時(shí)間及系統(tǒng)時(shí)間網(wǎng)絡(luò)更新的方法,涉及網(wǎng)絡(luò)程序設(shè)計(jì)與系統(tǒng)函數(shù)的使用,需要的朋友可以參考下
    2014-10-10
  • Qt計(jì)時(shí)器使用方法詳解

    Qt計(jì)時(shí)器使用方法詳解

    這篇文章為大家詳細(xì)主要介紹了Qt計(jì)時(shí)器的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C語言實(shí)現(xiàn)程序開機(jī)自啟動(dòng)

    C語言實(shí)現(xiàn)程序開機(jī)自啟動(dòng)

    本文給大家分享的是一則C語言實(shí)現(xiàn)開機(jī)自啟動(dòng)的代碼,主要是通過C來獲取程序路徑修改注冊(cè)表項(xiàng)來實(shí)現(xiàn),有需要的小伙伴可以參考下
    2016-01-01
  • C++多線程std::call_once的使用

    C++多線程std::call_once的使用

    本文主要介紹了C++多線程std::call_once的使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語言如何實(shí)現(xiàn)順序表(數(shù)據(jù)結(jié)構(gòu))

    C語言如何實(shí)現(xiàn)順序表(數(shù)據(jù)結(jié)構(gòu))

    這篇文章主要介紹了C語言如何實(shí)現(xiàn)順序表(數(shù)據(jù)結(jié)構(gòu))問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 使用用C++做一顆會(huì)跳動(dòng)的愛心實(shí)例代碼

    使用用C++做一顆會(huì)跳動(dòng)的愛心實(shí)例代碼

    大家好,本篇文章主要講的是使用用C++做一顆會(huì)跳動(dòng)的愛心實(shí)例代碼,感興趣的同學(xué)趕快來看一看吧,歡迎借鑒學(xué)習(xí)C++做一顆會(huì)跳動(dòng)的愛心實(shí)例代碼
    2021-12-12

最新評(píng)論

沁水县| 莎车县| 普兰店市| 曲阳县| 建昌县| 漳州市| 郴州市| 全州县| 南岸区| 息烽县| 荣昌县| 文山县| 梨树县| 乌鲁木齐市| 张家口市| 汾阳市| 南京市| 江华| 鄂托克前旗| 尉犁县| 通海县| 信丰县| 霞浦县| 若羌县| 昌乐县| 奉贤区| 美姑县| 莲花县| 长子县| 南岸区| 准格尔旗| 南木林县| 囊谦县| 肇庆市| 朔州市| 随州市| 观塘区| 鸡东县| 华亭县| 大竹县| 高雄市|