13

いくつかのコードを実行するのにかかるシステム時間を測定したいと思います。これを行うには、getrusage() への 2 つの呼び出しの間に上記のコードを挟むことになると思いますが、予期しない結果が得られます...

#include <sys/time.h>
#include <sys/resource.h>
#include <unistd.h>
#include <stdio.h>

int main() {
  struct rusage usage;
  struct timeval start, end;
  int i, j, k = 0;

  getrusage(RUSAGE_SELF, &usage);
  start = usage.ru_stime;
  for (i = 0; i < 10000; i++) {
    /* Double loop for more interesting results. */
    for (j = 0; j < 10000; j++) {
      k += 20; 
    }
  }
  getrusage(RUSAGE_SELF, &usage);
  end = usage.ru_stime;

  printf("Started at: %ld.%lds\n", start.tv_sec, start.tv_usec);
  printf("Ended at: %ld.%lds\n", end.tv_sec, end.tv_usec);
  return 0;
}

これで 2 つの異なる数値が生成されることを願っていますが、残念です。コンピューターが 1 ~ 2 秒考えると、結果は次のようになります。

Started at: 0.1999s
Ended at: 0.1999s

私は getrusage() を正しく使用していませんか? これらの 2 つの数値が異なってはならないのはなぜですか? 私が根本的に間違っている場合、 getrusage() を使用してソースコードのシステム時間を測定する別の方法はありますか? 読んでくれてありがとう。

4

3 に答える 3

17

「ユーザー」時間と「システム」時間の違いを誤解しています。サンプル コードは、測定中に主にユーザー モード (つまり、アプリケーション コードの実行) で実行されますが、「システム」時間は、カーネル モードでの実行 (つまり、システム コールの処理) で費やされた時間の尺度です。

ru_stimeシステム時間を測定するための正しいフィールドです。テスト アプリケーションでは、チェックする 2 つのポイントの間にたまたまそのような時間が発生しません。

于 2012-05-09T07:18:22.380 に答える
4

usage.ru_utime代わりに、ユーザーの CPU 使用時間である を使用する必要があります。

于 2012-05-09T04:20:36.840 に答える
0

gprof を使用します。これにより、各関数にかかる時間が得られます。gprof をインストールし、コンパイルに次のフラグを使用します。-pg -fprofile-arcs -ftest-coverage.

于 2012-05-09T06:03:34.197 に答える