我正在對一些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;
}
time'的'初始輸出將是節目開始到節目結束,如果有上下文切換這可能需要一段時間,像你這樣的時鐘時間:
沒有顯着的差異是我的桌面上觀察提及。我會相信high_resolution_clock,因爲它很可能在你的線程正在睡覺時也睡着。我知道你說過你不想顯示代碼,但是很高興看到你是如何檢測你的時間的,因此代碼對此很有幫助。 – AndyG
我上傳了時間,這與我發現的high_resolution_clock上的每個教程都沒有太大差別。 – pippin1289
糾正我,如果我錯了,但代碼中的假設是,蜱的數量代表秒?如果你使用'std :: chrono :: duration_cast(end_hrc-start_hrc)',輸出是什麼? –
AndyG