2017-10-06 91 views
0

我正在爲我必須爲一個類編寫的數據結構編寫一個深入的測試程序。我試圖花費多長時間來執行函數,並將它們存儲在數組中以供以後打印。要仔細檢查它是否正在工作,我決定立即打印它,並且我發現它不起作用。計時函數:雙重返回0 MS

這裏是我得到時間的代碼,並將它們存儲在一個結構體中的數組中。

void test1(ArrayLinkedBag<ItemType> &bag,TestAnalytics &analytics){ 
    clock_t totalStart; 
    clock_t incrementalStart; 
    clock_t stop; //Both timers stop at the same time; 
    // Start TEST 1 
    totalStart = clock(); 
    bag.debugPrint(); 

    cout << "Bag Should Be Empty, Checking..." << endl; 
    incrementalStart = clock(); 
    checkEmpty<ItemType>(bag); 
    stop = clock(); 
    analytics.test1Times[0] = analytics.addTimes(incrementalStart,stop); 
    analytics.test1Times[1] = analytics.addTimes(totalStart,stop); 
    cout << analytics.test1Times[0] << setprecision(5) << "ms" << endl; 
    std::cout << "Time: "<< setprecision(5) << (stop - totalStart)/(double)(CLOCKS_PER_SEC/1000) << " ms" << std::endl; 
    cout << "===========================================" << endl; //So I can find the line easier 

} 

這裏就是我做的,我在數組中我把計算的代碼,該功能位於TestAnalytics結構

double addTimes(double start, double stop){ 
    return (stop - start)/ (double)(CLOCKS_PER_SEC/1000); 
    } 

下面是我得到的輸出的一個片段:

Current Head: -1 
Current Size: 0 
Cell: 1, Index: 0, Item: 6317568, Next Index: -2 
Cell: 2, Index: 1, Item: 4098, Next Index: -2 
Cell: 3, Index: 2, Item: 6317544, Next Index: -2 
Cell: 4, Index: 3, Item: -683175280, Next Index: -2 
Cell: 5, Index: 4, Item: 4201274, Next Index: -2 
Cell: 6, Index: 5, Item: 6317536, Next Index: -2 
Bag Should Be Empty, Checking... 
The Bag Is Empty 
0ms 
Time: 0 ms 
=========================================== 

我想根據此網站上的其他帖子計算時間。 我在UNIX系統上使用clang編譯器。這個數字是否可能太小而不能顯示在0以上?

+0

'CLOCKS_PER_SEC/1000'可能是整數除法;不知道這是否與你的問題有關 –

+0

@ M.M我把這個翻譯成了兩個。我剛剛注意到,我的stop和totalStart都打印了0. –

+0

更改爲'1000.0',在你已經完成整數除法之後沒有任何一點投射到一個加倍 –

回答

1

除非你堅持使用舊的(預C++ 11)編譯器/庫,我會使用的功能從<chrono>頭:

template <class ItemType> 
void test1(ArrayLinkedBag<ItemType> &bag){ 
    using namespace std::chrono; 

    auto start = high_resolution_clock::now(); 
    bag.debugPrint(); 
    auto first = high_resolution_clock::now(); 
    checkEmpty(bag); 
    auto stop = high_resolution_clock::now(); 

    std::cout << " first time: " << duration_cast<microseconds>(first - start).count() << " us\n"; 
    std::cout << "second time: " << duration_cast<microseconds>(stop - start).count() << " us\n"; 
} 

有些部分有點冗長(把它很好),但它仍然工作得很好。 duration_cast支持差分類型降至(至少)nanoseconds,這通常足以支持相對較小/較快的代碼段定時(儘管不能保證它使用納秒精度的定時器)。

+0

謝謝,我會工作明天當我回來時試試這個,但我會告訴你。 –

1

除了Jerry's good answer(我已經投了票),我想添加一些可能有用的信息。

對於時間我推薦steady_clock超過high_resolution_clock,因爲steady_clock保證不會在您的計時期間調整(特別是向後)。現在在Visual Studio和叮噹中,這不可能發生,因爲high_resolution_clocksteady_clock是完全相同的類型。但是,如果您使用的是gcc,則high_resolution_clocksystem_clock的類型相同,可隨時進行調整(例如通過NTP更正)。

但是,如果您使用steady_clock,那麼在每個平臺上都有一個類似秒錶的計時器:不適合告訴您一天的時間,但不會在不合時宜的情況下被糾正。

此外,如果您使用my free, open-source, header-only <chrono> extension library,它可以以更友好的方式輸出持續時間,而不必使用duration_cast.count()。它會隨着價值打印持續時間單位。

最後,如果您連續多次調用steady_clock::now()(並在兩者之間沒有任何內容),並打印出該差異,則可以瞭解您的實現能夠如何精確地計時。它的時間可以短到飛秒嗎?可能不會。它是否像毫秒一樣粗?我們希望不會。

把所有這些組合起來,下面的程序編譯如下:

clang++ test.cpp -std=c++14 -O3 -I../date/include 

程序:

#include "date/date.h" 
#include <iostream> 

int 
main() 
{ 
    using namespace std::chrono; 
    using date::operator<<; 
    for (int i = 0; i < 100; ++i) 
    { 
     auto t0 = steady_clock::now(); 
     auto t1 = steady_clock::now(); 
     auto t2 = steady_clock::now(); 
     auto t3 = steady_clock::now(); 
     auto t4 = steady_clock::now(); 
     auto t5 = steady_clock::now(); 
     auto t6 = steady_clock::now(); 
     std::cout << t1-t0 << '\n'; 
     std::cout << t2-t1 << '\n'; 
     std::cout << t3-t2 << '\n'; 
     std::cout << t4-t3 << '\n'; 
     std::cout << t5-t4 << '\n'; 
     std::cout << t6-t5 << '\n'; 
    } 
} 

和輸出爲我在MacOS:

150ns 
80ns 
69ns 
53ns 
63ns 
64ns 
88ns 
54ns 
66ns 
66ns 
59ns 
56ns 
59ns 
69ns 
76ns 
74ns 
73ns 
73ns 
64ns 
60ns 
58ns 
...