2014-01-11 107 views
2

我想知道在Linux上用C++編寫函數的執行時間。我發現很多關於這個的帖子。我嘗試了這個鏈接中提到的所有方法Timer Methods來計算時間。以下是我的函數的執行時間結果:函數執行時間

time() :   0 seconds 
clock() :   0.01 seconds 
gettimeofday() : 0.002869 seconds 
rdtsc() :   0.00262336 seconds 
clock_gettime() : 0.00672151 seconds 
chrono :   0.002841 seconds 

請幫我這方法是在其讀數可靠,因爲所有的結果在他們的讀數也不同。我讀到你的操作系統在不同的任務之間切換,所以讀數不能被期望是非常準確的。有沒有一種方法可以計算CPU花費在我的功能上的時間。我聽說過使用分析工具,但還沒有找到任何功能的例子。請指導我。

+0

你的功能真的在做什麼? –

+0

它正在對輸入文本進行一些分析。 – Xara

+0

你應該多解釋一下,你應該嘗試使用更大的輸入文本。 –

回答

2

閱讀time(7)

由於各種原因(取決於您的實際硬件,即您的主板),時間並不像您想要的那麼精確。

因此,添加一些循環重複的功能很多次,或使其運行再更改它的輸入。確保整個程序(由time(1)給出...)的執行時間至少爲大約每秒(如果可能的話,請確保你至少有一半CPU時間的第二個)。

用於分析,編譯並鏈接到g++ -Wall -pg -O1,然後使用gprof(1)(有更復雜的配置方法,例如oprofile ...)。

另請參閱this answer到非常相似的question(通過相同Zara)。

+1

+爲「添加一些循環重複您的功能多次...」。 –

1

如果你正在做簡單的測試,試圖找出實現更好,那麼任何方法是好的。例如:

const int MAX = 10000;    // times to execute the function 

void benchmark0() { 
    auto begin = std::chrono::steady_clock::now(); 

    for (int i = 0; i < MAX; ++i) 
     method0(); 

    auto now = std::chrono::steady_clock::now(); 
    auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(now - begin); 
    std::cout << "Cost of method0() is " << elapsed .count() << " milliseconds" << std::endl; 
} 

void benchmark1() { /* almost the same as benchmark0, but calls method1 */ } 

int main() { 

    benchmark0(); 
    benchmark0(); 

    benchmark1(); 
    benchmark1(); 

} 

您可能已經注意到benchmark0benchmark1被稱爲連續兩次:因爲會有CPU的緩存,I/O ...,你可能想擺脫的性能增益/丟失由於緩存,但衡量純粹的執行時間。

當然,你也可以用G ++來分析程序。