web-dev-qa-db-ja.com

getrusage()を取得してCでシステム時間を測定する

コードの実行にかかるシステム時間を測定したいと思います。これを行うには、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()を使用してソースコードのシステム時間を測定する別の方法はありますか?読んでくれてありがとう。

11
Stout Joe

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

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

14
Eric Melski

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

3
shinkou

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

0
Manik Sidana