2017-04-17 3 views
3

例えば、私は(イベント駆動型シミュレーションのための)いくつかの有用な作業を行い、このような機能を持っている:私は私が何をすべきこのuseful_workのパフォーマンスの測定を行う必要がある場合はデコレータでコードをより明確にしますか?

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

を:

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

関連する問題