zirzirrrrr’s diary

日常の蓄積とかなんか

C/C++において処理時間測定にtime()なんか使うな

time()の戻り値は秒単位であり,また実時間の測定のみである.

実時間の測定を行いたいならgettimeofdayを,プロセス時間とシステム時間の測定を行いたいならgetrusageを用いること. マイクロ秒単位までの測定を行える.

以下コピペ用

実時間測定gettimeofday

/* gettimeofday_sample.c */

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

int main(void)
{
    struct timeval stert_real_time, end_real_time;

    gettimeofday(&stert_real_time, NULL);

    /* 処理 */

    gettimeofday(&end_real_time, NULL);

    printf("real\t%lfs\n", (end_real_time.tv_sec - stert_real_time.tv_sec) + (end_real_time.tv_usec - stert_real_time.tv_usec)*1.0E-6);

    return 0;
}

プロセス・システム時間測定getrusage

/* gettimeofday_sample.c */

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

int main(void)
{
    struct rusage start_resource_usage, end_resource_usage;

    getrusage(RUSAGE_SELF, &start_resource_usage);

    /* 処理 */

    getrusage(RUSAGE_SELF, &end_resource_usage);

    printf("user\t%lfs\n",
        (end_resource_usage.ru_utime.tv_sec  - start_resource_usage.ru_utime.tv_sec) +
        (end_resource_usage.ru_utime.tv_usec - start_resource_usage.ru_utime.tv_usec)*1.0E-6);
    printf("sys\t%lfs\n",
        (end_resource_usage.ru_stime.tv_sec  - start_resource_usage.ru_stime.tv_sec) +
        (end_resource_usage.ru_stime.tv_usec - start_resource_usage.ru_stime.tv_usec)*1.0E-6);

    return 0;
}