2013-03-14 29 views
0

我需要項目幫助。基本上我需要測量一些排序算法的時鐘滴答。由於他們都使用比較和有時交換功能,我設計他們接受這些作爲回調函數。模板函數中的全局值不會改變[C++]

爲了測量時鐘滴答我寫道:

static clock_t t1, total; 

template<typename T> 
bool less_default(T & left, T & right){ 
    t1 = clock(); 
    bool v = left < right; 
    t1 = clock() - t1; 
    total += t1 
    return v; 
} 

當我實際運行的算法,無論是全部或T1反映任何改變任何責任。彷彿引用它們的代碼行從來沒有寫過。

沒有用。在函數調用中甚至沒有增加一個簡單的整數。

難道靜態全局變量不能在模板函數內改變嗎?

我不明白我在做什麼錯在這裏。

+0

你是從同一個文件調用嗎?它是否在.h文件中? – littleadv 2013-03-14 07:18:30

+1

考慮將'static'改爲'extern',並在'main()'源文件(或其他合適的位置)聲明**一個** * real *的一組變量。 – WhozCraig 2013-03-14 07:22:21

+0

考慮衡量一百萬個對象的比較,而不是一個對象。請使用其他的但全局的東西。 – 2013-03-14 07:26:56

回答

3

沒有用。在函數調用中甚至沒有增加一個簡單的整數。

我懷疑下面出現在文件:

static clock_t t1, total; 

如果是這樣的話,每個翻譯單元會得到這兩個變量的其自己的獨立實例(感謝static)。

要解決,在頭改變staticextern,並添加以下的.cpp文件:

clock_t t1, total; 

編輯樣品遵循演示了此:

每OP的請求,這是一個簡短的例子,它使用模板比較器和該答案中的配方來聲明和管理運行時鐘總數。

main.h

#ifndef PROJMAIN_DEFINED 
#define PROJMAIN_DEFINED 

extern clock_t total; 

template<typename T> 
bool less_default(const T& left, const T& right) 
{ 
    clock_t t1 = clock(); 
    bool res = (left < right); 
    total += (clock() - t1); 
    return res; 
}; 

#endif 

的main.cpp

#include <iostream> 
#include <algorithm> 
#include <iterator> 
#include <vector> 
#include "main.h" 
using namespace std; 

clock_t total = 0; 

int main() 
{ 
    static const size_t N = 2048; 
    vector<int> values; 
    values.reserve(N); 
    std::srand((unsigned)time(0)); 

    cout << "Generating..." << endl; 
    generate_n(back_inserter(values), N, [](){ static int i=0; return ++i;}); 

    for (int i=0;i<5;++i) 
    { 
     random_shuffle(values.begin(), values.end()); 
     cout << "Sorting ..." << endl; 
     total = 0; 
     std::sort(values.begin(), values.end(), less_default<int>); 
     cout << "Finished! : Total = " << total << endl; 
    } 
    return EXIT_SUCCESS; 
} 

輸出

Generating... 
Sorting ... 
Finished! : Total = 13725 
Sorting ... 
Finished! : Total = 13393 
Sorting ... 
Finished! : Total = 15400 
Sorting ... 
Finished! : Total = 13830 
Sorting ... 
Finished! : Total = 15789 
+0

它的確如此。但將其改爲正常的全球變量也不會導致變化。我不能把這些放在我的cpp文件中,因爲編譯器會認爲這些值不存在 – Yuma 2013-03-14 07:22:53

+0

@Yuma:這是一個單獨的問題。您正在嘗試測量的時間少於單個時鐘的時間。 – NPE 2013-03-14 07:23:43

+2

@Yuma老實說,這是寫的方式,它將花費更長的時間* *測量比執行實際評估被測量。所以無論如何你的數字都會非常不準確。 – WhozCraig 2013-03-14 07:24:50

0

似乎有一個錯誤機智h你如何設置全局變量。 (NPE的回答涵蓋了這個。)

但是,另一個要記住的是,你正在試圖測量單一比較的性能。這取決於什麼是T,但對於大多數簡單類型,這將是一個或兩個CPU指令,這是遠的太小,不能用這樣的技術精確測量。

使用採樣分析器會更好。用你在這裏的代碼,你的儀器比正在完成的工作要昂貴得多,這使得分析數據無用。

+0

這只是一個例子。我在交換/交換功能中也使用了它。即使交換一個巨大的數組,時鐘滴答也不會變成除零之外的任何東西。 – Yuma 2013-03-14 07:30:09

+0

如果您在'std :: vector'上使用'std :: swap',則數組大小無關緊要;交換操作只是交換幾個指針(可能是幾十個操作碼)。 – StilesCrisis 2013-03-14 14:33:09