2017-02-27 38 views
-1

可以說我想測量一個特定函數的總時間。現在這個函數調用其他函數(f1和f2)。所以我想計算f1和f2的總時間。如何在clock_getime內clock_gettime?

我所期待的是f total time = f1 total time + f2 total time

void f(){ 
    struct timespec total_start, total_end; 
    struct timespec f1_start, f1_end; 
    struct timespec f2_start, f2_end; 

    clock_gettime(CLOCK_MONOTONIC, &total_start); 

     clock_gettime(CLOCK_MONOTONIC, &f1_start); 
     f1(); 
     clock_gettime(CLOCK_MONOTONIC, &f1_end); 

     clock_gettime(CLOCK_MONOTONIC, &f2_start); 
     f2(); 
     clock_gettime(CLOCK_MONOTONIC, &f2_end); 

    clock_gettime(CLOCK_MONOTONIC, &total_end); 

    f_total_time = (total_end.tv_sec - total_start.tv_sec) + (total_end.tv_nsec - total_start.tv_nsec)/1e9 ; 

    f1_total_time = (f1_end.tv_sec - f1_start.tv_sec) + (f1_end.tv_nsec - f1_start.tv_nsec)/1e9 ; 

    f2_total_time = (f2_end.tv_sec - f2_start.tv_sec) + (f2_end.tv_nsec - f2_start.tv_nsec)/1e9 ; 
} 

我的問題是,這是衡量的內部函數功能時的正確道路。

問題:我面臨的問題是F1和F2的總時間並沒有增加至F的總時間。即f total time != f1 total time + f2 total time真正發生的f total time > f1 total time + f2 total time

我做錯什麼了嗎?

+1

這需要一點時間來調用'clock_gettime',所以很自然的總時間超過時間各個功能調用。沒有什麼不對。如果你想避免這種情況,只需自己添加函數時間:*計算函數時間後,'f_total_time = f1_total_time + f2_total_time;'。 –

+0

你使用的是C++嗎? –

+0

沒有那是正確的,但調用'clock_gettime'需要時間! –

回答

0

要CHRONOMETER C++應用程序,注意初始時間在一個變量中,和申報的持續時間(秒):

#include "time.h" 
clock_t t (clock()); 
size_t duration (0); 
執行期間

,持續時間被更新這種方式:

duration = (clock() - t)/CLOCKS_PER_SEC; 
0

回答 -

是。恕我直言,它似乎是一個功能內的功能有效的持續時間測量技術 。

Posix clock_gettime()從固定的 時間報告秒/納秒,因此每個訪問都獨立於任何其他訪問。

從「人clock_gettime」:

所有實現支持全系統的實時時鐘, 這是由CLOCK_REALTIME標識。它的時間代表自Epoch以來的 秒和納秒。當其時間爲 已更改時,相對時間間隔的定時器不受影響,但絕對時間點的定時器會受到影響。

我認爲沒有錯用你的方法。

也許你需要更多地瞭解你的 代碼VS持續時間的相對持續時間的時鐘讀出你正在使用的機制。


在我的Ubuntu 15.10,上一個較舊的戴爾,使用克++ 5.2.1中,POSIX 呼叫

clock_gettime(CLOCK_REALTIME, ...) 

使用> 1500個納秒(平均超過3秒)(即〜1.5我們)

爲了實現重複性的一些措施,你是 試圖測量(F1()和f2()和F1()+ F2())一定要超過 這一點,可能是10倍的持續時間。

您的系統將是不同的(比我),所以你必須將其進行測試,以 知道這些時鐘多久讀取。

也有知道如何快速 CLOCK_REALTIME增量的有趣的想法。儘管API指示 納秒,但它可能並不那麼快。


我用另一種方法是的std ::時間(nullptr)用〜5個納秒(我的系統上),3個數量級更低的成本。供參考:::時間(0)措施相同。

由此API返回的循環僅在第二秒結束 時返回,此時返回值已從先前的 值更改。我通常累積3秒循環(即固定的 測試時間)並計算平均事件持續時間。

實施例的測量輸出:

751.1412070 M 'std::time(nullptr) duration' invocations in 3.999,788 sec (3999788 us) 
187.7952549 M 'std::time(nullptr) duration' events per second 
5.324948176 n seconds per 'std::time(nullptr) duration' event 

如果使用該時鐘的訪問,可以簡單地計算每個事件的秒的時候爲 你的函數減去每次調用5.3納秒(我的 系統)。


注:任何的Posix API是一個系統的接口提供 函數,而不是函數本身。

作爲API的一部分並不是確定的關於 函數實現的確鑿證據......它可以是任何語言的,即使是組合的最高性能也可以是 。

+0

我只注意到你正在使用「CLOCK_MONOTONIC」。我只使用CLOCK_REALTIME。我認爲我注意到的問題和10倍的想法仍然有效。 –