欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

具體的解釋在后面,我們先來看幾個例子,我們?nèi)藶橹圃鞄讉€時間復(fù)雜度分別為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ù)和生成批量測試我們在上一篇已經(jīng)介紹過了,這里不再重復(fù)。

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

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

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

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

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

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

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

運行我們的測試:

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

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

相關(guān)文章

  • 深入分析C++中幾個最不常用的關(guān)鍵字

    深入分析C++中幾個最不常用的關(guān)鍵字

    本篇文章是對C++中幾個最不常用的關(guān)鍵字進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 淺談C語言中的指針和數(shù)組有什么區(qū)別

    淺談C語言中的指針和數(shù)組有什么區(qū)別

    C語言中的指針和數(shù)組是兩個重要的數(shù)據(jù)結(jié)構(gòu),它們在內(nèi)存管理和數(shù)據(jù)存儲方面有許多相似之處,但也存在一些關(guān)鍵的區(qū)別,本文就來介紹一下C語言中的指針和數(shù)組有什么區(qū)別,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • 使用C++實現(xiàn)位圖處理

    使用C++實現(xiàn)位圖處理

    本文介紹了如何使用C++語言處理位圖圖像,包括讀取、修改、保存等操作。通過具體的代碼示例,讀者可以學(xué)習(xí)到如何利用C++中的位運算、數(shù)組和文件操作等知識點完成位圖處理任務(wù)。同時,本文也提供了一些常用的圖像處理算法供讀者參考,幫助讀者更好地理解位圖處理過程
    2023-04-04
  • C語言中實現(xiàn)“17進制”轉(zhuǎn)“10進制”實例代碼

    C語言中實現(xiàn)“17進制”轉(zhuǎn)“10進制”實例代碼

    這篇文章主要介紹了C語言中實現(xiàn)“17進制”轉(zhuǎn)“10進制”實例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • C語言求Fibonacci斐波那契數(shù)列通項問題的解法總結(jié)

    C語言求Fibonacci斐波那契數(shù)列通項問題的解法總結(jié)

    斐波那契數(shù)列相關(guān)問題是考研和ACM中常見的算法題目,這里特地為大家整理了C語言求Fibonacci斐波那契數(shù)列通項問題的解法總結(jié),需要的朋友可以參考下
    2016-06-06
  • C++解析Json的方法詳解【jsoncpp】

    C++解析Json的方法詳解【jsoncpp】

    這篇文章主要介紹了C++解析Json的方法,結(jié)合實例形式分析了C++操作json格式數(shù)據(jù)的相關(guān)實現(xiàn)技巧與注意事項,需要的朋友可以參考下
    2017-06-06
  • VisualStudio2019配置OpenCV4.5.0的方法示例

    VisualStudio2019配置OpenCV4.5.0的方法示例

    這篇文章主要介紹了VisualStudio2019配置OpenCV4.5.0的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • C++實現(xiàn)通訊錄管理系統(tǒng)

    C++實現(xiàn)通訊錄管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C++實現(xiàn)通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • delete[] p->elems和free(p->elems)區(qū)別介紹

    delete[] p->elems和free(p->elems)區(qū)別介紹

    delete[]和free()都是釋放內(nèi)存的函數(shù),但它們具有不同的使用方法和適用情況,這篇文章主要介紹了delete[] p->elems和free(p->elems)有什么區(qū)別,需要的朋友可以參考下
    2023-04-04
  • C語言實現(xiàn)求解最小公倍數(shù)的算法示例

    C語言實現(xiàn)求解最小公倍數(shù)的算法示例

    這篇文章主要為大家介紹了C語言如何實現(xiàn)求解任意兩個正整數(shù)的最小公倍數(shù),文中采用了窮舉法和定理法。感興趣的小伙伴快來跟隨小編一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12

最新評論