2016-09-12 40 views
4

我正在對一些C++代碼的時間進行簡單測試,並且遇到了一個我並非100%肯定的工件。代碼中的Linux時間和性能時鐘之間的區別

設置

我的代碼使用C++ 11 high_resolution_clock來測量經過的時間。我還使用Linux的time命令(/usr/bin/time)封裝了我的程序的執行。對於我的程序,high_resolution_clock報告〜2s,而time報告〜7s(〜6.5s用戶和〜.5s系統)。同時使用詳細選項顯示我的程序使用1個自願上下文切換和10個非自願上下文切換(/usr/bin/time -v),使用100%的CPU。

問題

我的問題是什麼原因引起的OS實時測量與性能測量之間的這種巨大差異?

我最初的想法

通過我的操作系統,我假設這些差異的瞭解僅通過上下文造成與其他軟件交換機(如time -v說明)。

這是造成這種差異的唯一原因嗎?我應該相信我的程序或系統在查看代碼性能時報告的時間嗎?

同樣,我的假設是相信從我的程序計算Linux時間的計算時間,因爲它不僅僅是我的程序的CPU使用率。

注意事項

  • 我不張貼代碼,因爲它不是手頭上的問題確實有關。如果你想知道這是一個簡單的測試,那就是100,000,000次隨機浮點算術運算。

  • 我知道我的C++代碼中的其他時鐘可能或多或少適合不同的情況(this stack overflow question)。 High_resolution_clock只是一個例子。

編輯:代碼的要求

#include <chrono> 
#include <cstdlib> 
#include <iostream> 
#include <vector> 

using namespace std; 
using namespace std::chrono; 

int main() { 
    size_t n = 100000000; 

    double d = 1; 

    auto start_hrc = high_resolution_clock::now(); 

    for(size_t i = 0; i < n; ++i) { 
    switch(rand() % 4) { 
     case 0: d += 0.0001; break; 
     case 1: d -= 0.0001; break; 
     case 2: d *= 0.0001; break; 
     case 3: d /= 0.0001; break; 
    } 
    } 

    auto end_hrc = high_resolution_clock::now(); 
    duration<double> diff_hrc = end_hrc - start_hrc; 
    cout << d << endl << endl; 
    cout << "Time-HRC: " << diff_hrc.count() << " s" << endl; 
} 
+0

time'的'初始輸出將是節目開始到節目結束,如果有上下文切換這可能需要一段時間,像你這樣的時鐘時間:

沒有顯着的差異是我的桌面上觀察提及。我會相信high_resolution_clock,因爲它很可能在你的線程正在睡覺時也睡着。我知道你說過你不想顯示代碼,但是很高興看到你是如何檢測你的時間的,因此代碼對此很有幫助。 – AndyG

+0

我上傳了時間,這與我發現的high_resolution_clock上的每個教程都沒有太大差別。 – pippin1289

+0

糾正我,如果我錯了,但代碼中的假設是,蜱的數量代表秒?如果你使用'std :: chrono :: duration_cast (end_hrc-start_hrc)',輸出是什麼? – AndyG

回答

0

我的問題是什麼原因引起的OS實時測量與性能測量之間的這種巨大差異?

看起來您的系統需要一段時間才能啓動您的應用程序。可能是一個資源問題:沒有足夠的可用內存(交換)或超額訂購的CPU。

Time-HRC: 1.39005 s 
real 0m1.391s 
user 0m1.387s 
sys  0m0.004s 
相關問題