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

淺談c++性能測試工具之計算時間復雜度

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

google benchmark已經為我們提供了類似的功能,而且使用相當簡單。

具體的解釋在后面,我們先來看幾個例子,我們人為制造幾個時間復雜度分別為O(n), O(logn), O(n^n)的測試用例:

// 這里都是為了演示而寫成的代碼,沒有什么實際意義
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); // 這個函數(shù)防止編譯器將表達式優(yōu)化,會略微降低一些性能
        }
    }
    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ù)和生成批量測試我們在上一篇已經介紹過了,這里不再重復。

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

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

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

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

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

在選擇正確的提示后對測試結果幾乎沒有影響,除了偏差值可以降得更低,使結果更準確。

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

運行我們的測試:

可以看到,自動的時間復雜度計算基本是準確的,可以在我們對算法進行測試時提供一個有效的參考。

以上就是淺談c++性能測試工具之計算時間復雜度的詳細內容,更多關于c++性能測試工具之計算時間復雜度的資料請關注腳本之家其它相關文章!

相關文章

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

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

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

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

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

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

    this指針識別了同一個類的不同的對象,換句話說,this指針使得成員函數(shù)可以訪問同一個類的不同對象。再深入一點,this指針使得成員函數(shù)會因為this指針的不同而訪問到了不同的成員變量
    2013-07-07
  • C++實例講解四種類型轉換的使用

    C++實例講解四種類型轉換的使用

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

    C++設置系統(tǒng)時間及系統(tǒng)時間網絡更新的方法

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

    Qt計時器使用方法詳解

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

    C語言實現(xiàn)程序開機自啟動

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

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

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

    C語言如何實現(xiàn)順序表(數(shù)據(jù)結構)

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

    使用用C++做一顆會跳動的愛心實例代碼

    大家好,本篇文章主要講的是使用用C++做一顆會跳動的愛心實例代碼,感興趣的同學趕快來看一看吧,歡迎借鑒學習C++做一顆會跳動的愛心實例代碼
    2021-12-12

最新評論

玉山县| 柘城县| 图片| 莱州市| 汤阴县| 白水县| 称多县| 伽师县| 民乐县| 武山县| 丰镇市| 库伦旗| 固安县| 越西县| 苍梧县| 惠安县| 安庆市| 乌拉特前旗| 衡东县| 阿荣旗| 类乌齐县| 天峻县| 莆田市| 安吉县| 宁陕县| 华容县| 临洮县| 德安县| 都匀市| 黑河市| 青川县| 华阴市| 昌平区| 扎兰屯市| 兴文县| 汽车| 闽侯县| 察隅县| 兴海县| 定结县| 包头市|