編輯:編寫這篇長篇文章解釋每一個小細節後我才發現我的問題......如果有人能給我一個很好的答案,以及如何在幾秒鐘內獲得執行時間(使用帶有5位小數的浮點數),我會將其標記爲已接受。提示:問題在於我如何解釋clock_getttime()手冊頁。測量代碼塊執行時間N倍的問題
嗨,
比方說,我有一個名爲myOperation
,我需要衡量的執行時間的功能。爲了衡量它,我使用了clock_gettime()
,因爲在其中一條評論中推薦使用here。
我的老師建議我們測量它N
次所以我們可以得到最終報告的平均值,標準偏差和中位數。他還建議我們執行myOperation
M
次而不是一次。如果myOperation
是一個非常快速的操作,那麼測量它可以讓我們瞭解所需的「實時」;導致正在使用的時鐘可能不具有測量此類操作所需的精度。所以,執行myOperation
只有一次或M
次真的取決於操作本身是否需要足夠長的時間來保證我們正在使用的時鐘精度。
我無法處理那個M
次執行。增加M
減少(很多)最終的平均值。這對我沒有意義。就像這樣,從A點到B點平均需要3到5秒鐘的時間。但是,你從A點到B點再返回到A點5次(這使它成爲10次,因此A到B和B一樣到A),然後你測量它。比你除以10,你得到的平均值應該是從A點到B點的平均值,這是3到5秒。
這是我想要我的代碼做的,但它不工作。如果我不斷增加從A到B和從A到A的次數,每次平均值會越來越低,這對我來說是沒有意義的。
理論已經足夠了,這裏是我的代碼:
#include <stdio.h>
#include <time.h>
#define MEASUREMENTS 1
#define OPERATIONS 1
typedef struct timespec TimeClock;
TimeClock diffTimeClock(TimeClock start, TimeClock end) {
TimeClock aux;
if((end.tv_nsec - start.tv_nsec) < 0) {
aux.tv_sec = end.tv_sec - start.tv_sec - 1;
aux.tv_nsec = 1E9 + end.tv_nsec - start.tv_nsec;
} else {
aux.tv_sec = end.tv_sec - start.tv_sec;
aux.tv_nsec = end.tv_nsec - start.tv_nsec;
}
return aux;
}
int main(void) {
TimeClock sTime, eTime, dTime;
int i, j;
for(i = 0; i < MEASUREMENTS; i++) {
printf(" » MEASURE %02d\n", i+1);
clock_gettime(CLOCK_REALTIME, &sTime);
for(j = 0; j < OPERATIONS; j++) {
myOperation();
}
clock_gettime(CLOCK_REALTIME, &eTime);
dTime = diffTimeClock(sTime, eTime);
printf(" - NSEC (TOTAL): %ld\n", dTime.tv_nsec);
printf(" - NSEC (OP): %ld\n\n", dTime.tv_nsec/OPERATIONS);
}
return 0;
}
注:以上diffTimeClock
功能是從這個blog post。我用myOperation()
取代了我的實際操作,因爲發佈我的真實功能沒有任何意義,因爲我必須發佈很長的代碼塊,如果您願意,可以使用任何喜歡的代碼輕鬆編碼myOperation()
。
正如你所看到的,OPERATIONS = 1
和結果是:
» MEASURE 01
- NSEC (TOTAL): 27456580
- NSEC (OP): 27456580
爲OPERATIONS = 100
結果是:
» MEASURE 01
- NSEC (TOTAL): 218929736
- NSEC (OP): 2189297
爲OPERATIONS = 1000
結果是:
» MEASURE 01
- NSEC (TOTAL): 862834890
- NSEC (OP): 862834
對於OPERATIONS = 10000
結果是:
» MEASURE 01
- NSEC (TOTAL): 574133641
- NSEC (OP): 57413
現在,我不是一個數學知識,實際上遠非如此,但這對我來說沒有任何意義。我已經和一個和我在一起的朋友談過這個問題,他也無法理解這些差異。我不明白爲什麼當我增加OPERATIONS
時價值越來越低。無論執行多少次,操作本身應該是同一時間(平均而言,不是完全相同的時間)。
你能告訴我,實際上依賴於操作本身,正在讀取的數據和一些數據可能已經在緩存和喇嘛喇嘛,但我不認爲這是問題。在我的情況下,myOperation
正在讀5000行文字從CSV文件,通過;
分離值和插入這些值到數據結構中。對於每次迭代,我都銷燬數據結構並重新初始化它。
現在我想到了,我也認爲測量時間有一個問題,clock_gettime()
,也許我沒有正確使用它。我的意思是,看最後一個例子,其中OPERATIONS = 10000
。總共耗時574133641ns,大約爲0.5s;這是不可能的,花了幾分鐘,因爲我無法忍受看着屏幕等待,並去吃東西。
由於您正在測量兩個事件之間的掛鐘時間,因此應該使用'CLOCK_MONOTONIC'而不是'CLOCK_REALTIME' - 如果系統時間更改,則前者不會受到影響,後者可以跳轉。 – caf 2010-05-12 22:37:42
是的,但爲什麼系統時間會發生變化,而不需要我手動執行? – 2010-05-12 22:50:59
因爲像'ntpd'這樣的系統守護進程改變了它? (或共享系統上的系統管理員?) – caf 2010-05-12 23:30:01