私は64ビットのUbuntu 12.04システムを使用しており、次のコードを試しました:
#include <unistd.h>
#include <time.h>
#include <stdio.h>
int
main(void)
{
struct timespec user1,user2;
struct timespec sys1,sys2;
double user_elapsed;
double sys_elapsed;
clock_gettime(CLOCK_REALTIME, &user1);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &sys1);
sleep(10);
clock_gettime(CLOCK_REALTIME, &user2);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &sys2);
user_elapsed = user2.tv_sec + user2.tv_nsec/1E9;
user_elapsed -= user1.tv_sec + user1.tv_nsec/1E9;
printf("CLOCK_REALTIME: %f\n", user_elapsed);
sys_elapsed = sys2.tv_sec + sys2.tv_nsec/1E9;
sys_elapsed -= sys1.tv_sec + sys1.tv_nsec/1E9;
printf("CLOCK_PROCESS_CPUTIME_ID: %f\n", sys_elapsed);
}
私が理解しているように、これは次のように出力する必要があります
CLOCK_REALTIME: 10.000117
CLOCK_PROCESS_CPUTIME_ID: 10.001
しかし、私の場合、私が得るのは
CLOCK_REALTIME: 10.000117
CLOCK_PROCESS_CPUTIME_ID: 0.000032
これは正しい動作ですか?もしそうなら、どうすればsys1とsys2の実際の秒数を知ることができますか?
CLOCK_PROCESS_CPUTIME_ID を CLOCK_REALTIME に変更すると、期待どおりの結果が得られますが、精度が必要なため、それは私が望むものではありません。
[編集] どうやら CLOCK_PROCESS_CPUTIME_ID は、CPU が処理に費やした実際の時間を返します。CLOCK_MONOTONIC は正しい値を返すようです。しかし、どの程度の精度で?