2017-04-24 29 views
0

有沒有辦法通過傳遞參數來測量函數花了多少時間?我的想法是衡量函數的本體和整個函數本身。這是正確的方法嗎?下面僞代碼:測量將參數傳遞給函數所需的時間

int main(){ 
    int start = time.now(); 
    // passing by value 
    int timeOfFunc = foo(vector<my_object> huge_vector, vector<my_object2> huge_vector2); 
    int end = time.now(); 
    int timeSpentPassingArgs = (end - start) - timeOfFunc; // getting time it takes to pass the argument? 
} 

int foo(vector<my_object> huge_vector, vector<my_object2> huge_vector2) 
{ 
int start = time.now(); 
// body of the foo function 
int end = time.now(); 
return (end - start); 
} 
+0

'foo(vector huge_vector,vector huge_vector2)'這不是你如何調用函數。 – Rakete1111

+2

爲什麼你需要測量通過參數需要多長時間?如果你想要花費多長時間製作一份副本,只需要時間複印。否則,只需通過引用/ const引用/右值引用傳遞「大」對象,並且不要開始複製。 – NathanOliver

+0

@ Rakete1111因此,短語「下面的僞代碼」 – WhozCraig

回答

0

我看不出您的方法有什麼問題,只不過您的計時將包括在函數中調用time.now()兩次所需的時間。儘管與複製的成本相比,這應該是相當小的。

另外,你可以嘗試如下的選項像(使用僞代碼):

function(parameters) 
{ 
    return time.now(); 
} 

// calling code 
time start = time.now(); 
time end = function(paramters); 
time total_time = end - start; 

這應該告訴你它到底需要多長時間,只是調用函數和複製的參數。我不確定編譯器是否被允許/可以優化出一個未使用的參數副本,但是如果它是這樣,你應該得到一個零。

1

首先,我建議打印進行調用的函數的彙編語言。這應該讓你瞭解傳遞變量所需的工作。

爲了獲得有意義的配置文件,您應該測量函數調用之前的時間以及執行1E6次迭代之後的時間。然後可以獲得調用函數所需的平均執行時間。

另一種替代方法是查找函數調用中使用的每個彙編指令所需的時鐘週期。由於處理器執行彙編語言指令的方式(它可能並行執行,代碼可能或可能不在指令高速緩存等中),這可能並不準確。

編輯1:示波器
測量性能的好工具是示波器。在嵌入式系統區域,代碼寫入測試點(或LED)。例如,在函數調用之前,LED將被打開,並在函數調用之後關閉。示波器探頭將連接到LED。然後可以使用o'scope來測量LED打開的持續時間。再次,許多迭代將需要執行以獲得更好的平均值。