2017-08-24 28 views
3

說明 測量重載操作的時間和成員函數的函數


是否有可能編寫可被用於測量操作者的其它功能的時間,以及是這樣的函數:

// pass an operator as an argument 
measureTime(MyClass::operator*, lhs, rhs); 

// Pass a function as an argument 
measureTime(MyFunction(arg1, arg2)); 

// or 
measureTime(MyFunction, arg1, arg2); 

// or other signatures ... 

我碰到一個函數模板來做到這一點:

template<typename F, typename... Args> 
double measureTime(F func, Args&&... args){ 
    auto t1 = high_resolution_clock::now(); 
    func(std::forward<Args>(args)...); 
    return high_resolution_clock::now() - t1; 
} 

不知道如何使用這個(或寫一個新的函數)來衡量超載運營商的時間。

問題


  • 什麼是做到這一點(如果可能的話)的最好方法?
  • 如果不可能,還有其他選擇嗎?


我寫的大整數運算庫,我使用不同的算法和想測量(和比較)的時間(看看他們的行爲)通過不同長度的整數時, ...

這是我的課的一部分:

class bigint { 
    public: 
     int compare(const bigint& other) const; 
     bigint operator*(const bigint& rhs) const; 
     bigint& operator++(); 
     bigint otherAlgorithms(const bigint& other) const; 
     // and more ... 
} 

我也有很多的輸入數據,並想通過那些在for循環內的數據並打印出時間。

這就是爲什麼我在尋找一個通用的函數,可以打印任何函數/操作符的時間。

+1

如果使用'的std :: invoke'而不是自己這個調用該函數應與成員的工作職能 - – tkausl

+1

除非'MyFunc'返回一個函數,傳遞'MyFunction的(ARG1,ARG2)'將結果傳遞表達式 – Vivick

+0

運算符仍然是一個函數,所以傳遞它應該沒有問題。像'運營商<<(a,b)' – AndyG

回答

6

std::invoke可以調用功能,lambda表達式和成員函數,所以讓std::invoke處理函數調用:

template<typename... Args> 
double measureTime(Args&&... args){ 
    auto t1 = high_resolution_clock::now(); 
    std::invoke(std::forward<Args>(args)...); 
    return duration(high_resolution_clock::now() - t1); 
} 

現在你可以衡量的成員函數和操作符:

struct Test { 
    void aFunction() { 
     std::cout << "Hello World\n"; 
    } 

    void operator++() { 
     std::cout << "Hello World\n"; 
    } 
}; 
int main() 
{ 
    Test t; 
    std::cout << measureTime(&Test::aFunction, t) << "\n"; 
    std::cout << measureTime(&Test::operator++, t) << "\n"; 
} 

Working Example

編輯: 即使我不建議使用它,它看起來不錯:

#define MEASURE(call) measureTime([&](){ call; }) 
std::cout << MEASURE(t.aFunction()) << "\n"; 

它允許你測量多個函數調用。

std::cout << MEASURE(t.aFunction(); t.aFunction(); t.aFunction();) << "\n"; 
+0

感謝您的回答。更具體地說,這是我的運算符的簽名:'bigint運算符*(const bigint&rhs)const'。 (它有爭論)。 –

+2

您可以在函數和類實例之後傳遞參數,即'measureTime(&bigint :: operator *,bigint1,bigint2);'其中'bigint1'是成員被調用的實例(它的''this'函數),'bigint2'是參數。 – tkausl