2017-04-17 24 views
3

例如,我有這樣的功能,它執行了一些有用的工作(事件驅動仿真):使裝飾者的代碼更清晰嗎?

int function() 
{ 
    do_useful_work(); 
    return 0; 
} 

如果我需要做我應該做的這個useful_work的性能測量:

int function() 
{ 
    count_time(time_before); 
    count_X_metrics(X_before); 

    do_useful_work(); 

    count_time(time_after); 
    count_X_metrics(X_after); 

    return 0; 
} 

這種方法使代碼更笨拙。有沒有辦法,撇開int function()以外的這些計數來使代碼更清晰?

+1

有被稱爲「性能監測器」或只是「探查」,它分析正在運行的軟件來獲得這種軟件件的信息。檢查你的編譯器是否提供這樣的東西。 –

+0

@BobJarvis如果對於事件驅動的模擬,我不能使用分析器。 –

回答

4

你可以創建自己的裝飾像下面這樣:

#include<functional> 
#include <iostream> 

void count_time() {}; 
void count_X_metrics() {}; 

void decorator(std::function<void()> work) 
{ 
    count_time(); 
    count_X_metrics(); 

    work(); 

    count_time(); 
    count_X_metrics(); 
} 


void do_work_1() { 
    std::cout << "Hello, World 1!" << std::endl; 
} 

void do_work_2() { 
    std::cout << "Hello, World 2!" << std::endl; 
} 

int main() { 
    decorator(do_work_1); 
    decorator(do_work_2); 
} 

編輯:我不知道你的count_timecount_X_metrics功能是如何工作的,但如果你需要更復雜的東西,還是有辦法來跟蹤的狀態,你可以創建一個對象來爲你工作。這肯定是不同的比你需要的,但希望它傳達了我想說明一點:

#include<functional> 
#include <iostream> 

int current_time() { return 0; } 
int x_metric() { return 0; } 

class Timer { 
    public: 
    void time(std::function<void()> work) { 
     // Capture state before 
     int starttime = current_time(); 
     int startmetric = x_metric(); 

     work(); 

     // Capture state after 
     int endtime = current_time(); 
     int endmetric = x_metric(); 

     // Update results 
     ellapsed = endtime - starttime; 
     metric = endmetric - startmetric; 

     // Possibly do something with the metrics here. 
     // ... 
    } 

    int get_ellapsed() { return ellapsed; } 
    int get_metric() { return metric; } 

    private: 
    int ellapsed; 
    int metric; 
}; 

void do_work_1() { 
    std::cout << "Hello, World 1!" << std::endl; 
} 

void do_work_2() { 
    std::cout << "Hello, World 2!" << std::endl; 
} 

int main() { 
    Timer t; 
    t.time(do_work_1); 

    // Possibly do something with the metrics here. 
    // cout << t.get_ellapsed(); 

    t.time(do_work_2); 
} 
+0

count_time()和count_X_metrics()的參數呢? –

+0

看我的編輯。我不確定它是否更有幫助。如果沒有,如果你用'count_time'和'count_X_metrics'做了什麼,你能否給我一個更好的想法? – Alden