2017-06-08 17 views
1

ZedboardにC++コードを実装しました。コンパイルと実行は完璧ですが、パフォーマンスを最適化するためにパフォーマンスをチェックしたいと思います。 物事を明確にするために...ZedboardのC++プログラムで時間パフォーマンスをチェックする方法

を私はここにいくつかのここのスレッド(Testing the performance of a C++ app)及び(Timer function to provide time in nano seconds using C++)をチェックしましたが、私は本当にそれを月コードを適用する方法を理解していない:私はC++が得意ではないよ、私は形式的に言語を実際に学んだことはありませんが、特定のライブラリで数回だけ使用しています。私は使用しているコードの作成者でもない(教授によって私に与えられた)。ここ

私の目標は、私がZedboard上でプログラムを実行すると、グローバルの各機能に費やすと時間をチェックすることです。このコードは、このイメージで起動しているSDカード上のLinuxイメージ上にあります。これは、画像処理アプリケーションにopencvライブラリを使用しています。私はg ++ 4.6.3をコンパイラとして使用しています。

お返事ありがとうございます!

+1

タイマーを定義してから、関数を実行する前後の時間を取得する必要があります。違いは、あなたの経過時間です。 – turoni

+0

Valentin、まだZedboardのZynq SoCのARM側(PS)ですか?他のARM Cortex-A9やその他のARMv7エポックのARM Cortex-Aと同様に動作するはずです。コンパイラとそのバージョン(コードをクロスコンパイルするために使用するザイリンクスツールのバージョン、コードをどのようにコンパイルしたか)を教えてください。 – osgx

+0

@osgx私はSDカードにインストールされたLinaro UbuntuでZedboardブートを作ったので、私はARMの部分ではなくFPGA部分で作業していると思います。 Makefileに 'g ++ -4.6'を使ってTerminalでコンパイルします。 –

答えて

0

あなたは<chrono>ヘッダを使用して簡単なタイマークラスを作成することができます。このような何か:

class Timer 
{ 
public: 
    using clock = std::chrono::steady_clock; 

    void clear() { start(); tse = tsb; } 
    void start() { tsb = std::chrono::steady_clock::now(); } 
    void stop() { tse = std::chrono::steady_clock::now(); } 

    auto nsecs() const 
    { 
     using namespace std::chrono; 
     return duration_cast<nanoseconds>(tse - tsb).count(); 
    } 

    double usecs() const { return double(nsecs())/1000.0; } 
    double msecs() const { return double(nsecs())/1000000.0; } 
    double secs() const { return double(nsecs())/1000000000.0; } 

    friend std::ostream& operator<<(std::ostream& o, Timer const& timer) 
    { 
     return o << timer.secs(); 
    } 

private: 
    clock::time_point tsb; 
    clock::time_point tse; 
}; 

あなたは、単にこのようにそれを使用することができます:

Timer timer; 

timer.start(); 

// do some stuff 
std::this_thread::sleep_for(std::chrono::milliseconds(600)); 

timer.stop(); 

std::cout << timer << " seconds" << '\n'; 

EDIT:<chrono>が利用できない場合は、clock_gettime()を使用することができますPOSIXシステムで:

class Timer 
{ 
public: 
    void clear() { start(); tse = tsb; } 
    void start() { clock_gettime(CLOCK_MONOTONIC, &tsb); } 
    void stop() { clock_gettime(CLOCK_MONOTONIC, &tse); } 

    long nsecs() const 
    { 
     long b = (tsb.tv_sec * 1000000000) + tsb.tv_nsec; 
     long e = (tse.tv_sec * 1000000000) + tse.tv_nsec; 
     return e - b; 
    } 

    double usecs() const { return double(nsecs())/1000.0; } 
    double msecs() const { return double(nsecs())/1000000.0; } 
    double secs() const { return double(nsecs())/1000000000.0; } 

    friend std::ostream& operator<<(std::ostream& o, Timer const& timer) 
    { 
     return o << timer.secs(); 
    } 

private: 
    timespec tsb; 
    timespec tse; 
}; 
+0

あなたの答えをありがとう、私はこれを試し、結果を投稿します。私はこのヘッダーをどこかでダウンロードする必要があると思いますか? –

+0

@ValentinDuboisいいえ「」は標準の 'C++'の一部です。 – Galik

+0

残念ながら、ヘッダーは私のバージョンに含まれていません。私はからclock_gettime()を使うことを考えています。 –

0

私は不満足な解決策を見つけましたが、それが何らかの助けになることができるなら、私はまだそれを投稿できると思いました。

私は<time.h>で定義されたgettimeofday()機能を利用しました。それは使用することが非常に簡単ですが、私は後で説明するかもしれない欠陥があります。私は、ミリ秒単位の時間を測定し、画面に表示

timeval t1, t2; 
gettimeofday(&t1, NULL); 
/* some function */ 
gettimeofday(&t2, NULL); 
double time; 
time = (t2.tv_sec - t1.tv_sec)*1000.0 + (t2.tv_usec - t1.tv_usec)/1000.0; 
cout << time << "ms" << "\n"; 

この道を。ただし、gettimeofdayはコンピュータ時計に基づいていませんが、実際の時刻に基づいています。明確にするために、2つの呼び出しの間に経過した時間は実際に私の関数だけでなく、Ubuntuでバックグラウンドで実行されているすべてのプロセスも含んでいます。言い換えれば、これは私の関数が実行するのにかかる正確な時間を与えるものではありませんが、少し高い値です。

EDIT:もう一度別の解決策を見つけました。clock()の機能を<time.h>から取得しました。その結果は前の方法と比較して正しいようです。残念ながら、精度は3桁で数秒になるので十分ではありません。

+0

Unix/Linux/POSIXの世界では、 'gettimeofday'と同様に(" wall time "(https://en.wikipedia.org/wiki/Wall-clock_time)ではなく)CPU時間のタイマーがあります。カーネルによって測定され、[getrusage](http://man7.org/linux/man-pages/man2/getrusage.2.html)のようなRUSAGE_SELFと 'ru_utime'フィールドを持ついくつかのsyscallsで報告されています。しかし、このクロックは、1msや10msのような大きなステップで測定されることが多く、サブミリスの機能タイミングを測定するのには使用できません。 – osgx

+0

@osgxあなたの答えをありがとう!どのように私はそれを使用する必要がありますかの簡単な例を私に与えることは可能でしょうか? –

+0

バレンタインは、ru_utimeとstackoverflow.com/questions/10509660/のように。これはまた、ポイント(10ms〜1ms)の後に2または3桁の低解像度結果を与えます。プログラムの長い部分を使って測定するか、gettimeofdayを使用していくつかの測定を行います。あなたのプログラムに外部I/Oや待ち受けのシステムコールがない場合、gettimeofdayは正確で正確な値を返すでしょう。 – osgx

関連する問題