2016-05-27 5 views
1

メソッド自体の実行時間とメソッドの実行時間を追跡しています。これはROSパッケージに入っているので、私は時間を取るためにROSを使用しています。それは非常に便利です。ドキュメントはhttp://wiki.ros.org/roscpp/Overview/Timeにあります。メソッドからの戻り時間が長くなるC++

void ClassName::my_method() 
{ 
    ros::Time t_start = ros::Time::now(); 
    // do stuff 
    ros::Duration d_execution = ros::Time::now() - t_start; 
} 

void ClassName::Func() 
{ 
    ros::Time t_total = ros::Time::now(); 
    my_method(); 
    ros::Duration d_total = ros::Time::now() - t_total; 
} 

問題は、d_totalが常にd_executionよりかなり長いことです。

d_executionは通常20-40マイクロ秒ですが、d_totalは約150マイクロ秒です。

なぜこれが起こっているのかわかりません。私の理解は、メソッドの最後に起こっている唯一の事柄は、メソッドでスタック上に作成されたメモリの割り当てを解除することです。しかし、私は変数の数の半分を作成するだけのコードを書き直しました、そして、私はd_totalに何の変化も見ませんでした。関数を返すのに時間がかかるようにするために、他に何が起こることがありますか?どんな助けもありがとうございます。

編集:私はros :: Time :: now()の時間を測定しましたが、それは無視できるようです。

time_t now, then; 
    time(&now); 
    ros::Time t = ros::Time::now(); 
    time(&then); 
    printf("t1-t0: %f", difftime(now, then)); 

出力は「t1-t0:0.000000」です。

また、メソッドでスタックに割り当てられた変数はすべてdouble型です。唯一の例外は2つのstd :: vectorで、2〜3要素しか含まれていません。

+3

空のメソッド呼び出しにはどのくらいの時間がかかりますか? – tadman

+0

あなたは何回テストをしましたか?アセンブラコードをチェックしましたか? –

+0

バックグラウンドでいくつのタスクを実行していますか?スケジューラが遅延を引き起こす可能性があります。 –

答えて

0

戻ってきたら、メソッド呼び出しは最上位レベルで宣言されたすべてのものをデストラクタで呼び出します。これらのデストラクタは、より多くのデストラクタを呼び出すことができます。

また、復帰時にレジスタ値を復元することはできますが、100マイクロ秒かかることはほとんどありません。

スタックメモリを解放するには、非常に高速な(おそらく1つのコマンドである)スタックポインタの値を変更します。

1

my_method()の正確なバージョンとどのくらいの違いがありますか?

my_methodは仮想ですか?

パフォーマンステストを行うときは、平均ではなく百分位数を表示する方が自然な方法です。

これが差を測定するために、より正確な方法であろう次のとおりです。

void ClassName::my_method() 
{ 
    ros::Time t_start = ros::Time::now(); 
    { // note this 
    // do stuff 
    } // and node this, destructors will be run before the next line 
    ros::Duration d_execution = ros::Time::now() - t_start; 
} 

のLinux/OSXの下であなたは、私は通常、パフォーマンステストに使用するものclock_gettime()を使用しようとすることができます。 C++では、std :: chrono :: duration(http://en.cppreference.com/w/cpp/chrono/duration)を試すことができます。おそらくros :: Timeは時間がかかります。

+0

こんにちは、私はあなたのアプローチを試み、変化は見られませんでした。違いを正確に測定する方法についての情報をありがとうございます。 – Sterling

関連する問題