1

私が書いている単純なプログラムの CPU 使用率をプロファイリングしています。試してみたいさまざまなアルゴリズムがあり、システム全体のパフォーマンスへの影響も知りたいです。

現在、ualarm() を使用して 30Hz でいくつかの命令を実行しています。これらの割り込みの 15 回ごと (0.5 秒ごと) に getrusage() を使用して CPU 時間を記録します (u 秒単位)。その時点での CPU 消費の合計 CPU 時間を推定します。しかし、コンテキストを取得するには、その期間にシステムで経過した合計時間も知る必要があるため、プログラムで使用されている割合を知ることができます。

/* Main Loop */
while(1) 
{
    alarm = 0;

    /* Waiting Loop: */
    for(i=0; !alarm; i++){
    }

    count++;

    /* Do my things */

    /* Check if it's time to store cpu log: */
    if ((count%count_max) == 0)
    {
        getrusage(RUSAGE_SELF, &ru);
        store_cpulog(f,
                (int64_t) ru.ru_utime.tv_sec,
                (int64_t) ru.ru_utime.tv_usec,
                (int64_t) ru.ru_stime.tv_sec,
                (int64_t) ru.ru_stime.tv_usec);
    }


}

さまざまなオプションがありますが、どれが最も正確な結果を提供するかわかりません。

  1. ualarmタイミングに使います。現在、0.5 秒ごとに信号を送るようにプログラムされているため、この 0.5 秒を CPU 時間として使用できます。使用するのは明らかですが、それが最良のオプションですか?

  2. 用途clock_gettime(CLOCK_MONOTONIC):nanosec分解能のある測定値を提供します。

  3. 用途gettimeofday():usec分解能のある測定値を提供します。私はそれを使用することに反対する意見を見つけました。

推奨事項はありますか?ありがとう。

4

2 に答える 2

0

Callgrindは、Linux で C/C++ コードをプロファイリングするのに最適なアプリケーションです。誇りを持って使用してください:)

于 2013-10-15T17:30:06.283 に答える
0

考えられる解決策は、システム関数時間を使用し、プログラムでビジー ループ (@Hasturkun が言うように) を使用しないことです。コンソールで呼び出す:

time /path/to/my/program

それを実行すると、次のようなものが得られます。

real    0m1.465s
user    0m0.000s
sys     0m1.210s

それがあなたにとって十分かどうか、精度についてはわかりません。

于 2013-10-15T17:08:35.890 に答える