2012-05-09 6 views
9

いくつかのコードを実行するのにかかるシステム時間を測定したいと思います。これを行うには...私はサンドイッチを2回の呼び出しの間のコードは)(GETRUSAGEからと言われますけど、私はいくつかの予期しない結果を得るCでのシステム時間を測定するためのgetrusage()の取得

#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つの異なる番号を生成することを望んでいるだろう!私は()右GETRUSAGEからを使用していない

Started at: 0.1999s 
Ended at: 0.1999s 

アム:私のコンピュータは1秒か2秒のために考えて見た後、これが結果ですか?なぜこれらの2つの数字が違ってはならないのですか?私が根本的に間違っている場合、getrusage()を使用してソースコードのシステム時間を測定する別の方法がありますか?読んでくれてありがとう。

+1

'tv_usec'はマイクロ秒ですので、フォーマットは'%lu。%06u'でなければなりません。 – Mapio

答えて

9

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

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

+1

ありがとう!あなたは私の教授ができるよりもこのことを説明しました。 –

2

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

+0

これは実際に私にもっと好ましい結果を与えます。しかし、私はまだいくつかのコードのシステム時間を測定するための有効な方法を見つけることを義務付けられています。 usage.ru_stimeがうまく動作しない場合の使用方法は? –

+1

プログラムがカーネルモードで動作するように設計されている場合は、 'ru_stime'を使用してください。それ以外の場合は、 'ru_utime'を使います。 – shinkou

+0

私はCPUクロックで 'clock_gettime'を使用します... –

0

gprofを使用してください。これにより、各機能の使用時間がわかります。 gprofをインストールし、これらのフラグを-pg -fprofile-arcs -ftest-coverageコンパイルに使用します。

関連する問題