2014-12-08 132 views
1

我正在使用以下方法對STL容器矢量,deque,list,multiset和multimap進行一些操作。時序STL容器 - 多變?

PrecisionTimer::PrecisionTimer() 
{ 
    LARGE_INTEGER cps; 
    LARGE_INTEGER init_cnt; 

    QueryPerformanceCounter(&init_cnt); 
    QueryPerformanceFrequency(&cps); 

    start_count = init_cnt.QuadPart; 
    microseconds_per_count = 1000000.0/cps.QuadPart; 
} 

void PrecisionTimer::ReStart() 
{ 
    LARGE_INTEGER init_cnt; 
    QueryPerformanceCounter(&init_cnt); 
    start_count = init_cnt.QuadPart; 
} 


// in microseconds 
unsigned int PrecisionTimer::ElaspedTime() const 
{ 
    LARGE_INTEGER cnt; 
    QueryPerformanceCounter(&cnt); 
    return (unsigned int)((cnt.QuadPart - start_count) 
         * microseconds_per_count + 0.5); 
} 

的方法很簡單: 我有一個完整的列表框的字符串,將它們移動到一個載體中,然後從載體到STL容器添加元素。然後刪除容器中的所有元素,並以微秒爲單位接收所花費的時間。

我的問題是關於變化:有時我的審判是60,000+微秒不同於第一個。爲什麼?它與定時器實現有關嗎?我已經指出了時間片和高速緩存的影響方向。任何人都可以詳細說明嗎? CPU使用率會影響它嗎?

我並不是要求更好地實現計時器。我在問爲什麼它變化。

+0

同樣的原因,它需要一個小時的時間,時鐘從週五下午4:55到下午5:00 - 外星人! – 2014-12-08 04:35:36

+0

您是否正在編譯優化?如果它沒有副作用,你確定你正在計時的代碼沒有被優化嗎?沒有看到你正在運行的測試,很難猜測。 – 2014-12-08 04:49:54

+0

計時測試是沒有意義的,如果你正在運行一個未優化或「調試」版本。 – PaulMcKenzie 2014-12-08 05:04:50

回答

1

簡而言之,系統中有少量的cpu核心,但同時運行着大量的進程。爲了實現這一點,操作系統將在爲下一個操作等同之前分配時間給一個進程。根據正在做什麼程序,它們可能不需要它們的部分或全部時間片。由於這種情況有所不同,正如運行的進程數量一樣,您可以在每次調用代碼之間有一段可變的時間間隔 - 如果與您自己的代碼的恆定執行時間相結合,則會導致不同的秒數從你開始你的程序開始直到它完成的時間。

由於QueryHighPerformance函數返回掛鐘上的時間,因此它不會考慮這些調度差異,因此它會報告變化的數量作爲使用相同數據執行相同代碼所需的時間。理想的定時器會回到你的過程中所消耗的時間只有 - 就像在Win7的任務管理器提供的「CPU時間」欄(查看 - >選擇Columns-> CPU時間)