要約:http://cookiebear.info/archives/351
最近急にC言語の各関数の運行時間をテストする必要があります.検索してみたら、4つの方法がプログラムの運行時間を測る目的を達成することができます.それらはそれぞれclock,times,gettimeoff day,getrusageを用いて実現される.それぞれの優劣を比較して紹介します.
システムテスト環境:Virtual Box(Ubuntu 9.10)gcc version 4.4.1 libc 6 2.0.1-uuntu 16 Core Duo T 2500 2 GMHz
まず私のテスト用のプログラムを貼り付けてください.プログラムの処理は簡単です.1024*1024のマトリックスを記入します.11行目の定義値を修正すれば、異なる測定方法が使用できます.
#include <sys/time.h>
#include <sys/resource.h>
#include <unistd.h>
#include <stdio.h>
#include <time.h>
#define TEST_BY_CLOCK (char)(0x00)
#define TEST_BY_TIMES (char)(0x01)
#define TEST_BY_GETTIMEOFDAY (char)(0x02)
#define TEST_BY_GETRUSAGE (char)(0x03)
#define TEST_METHOD (TEST_BY_GETTIMEOFDAY)
#define COORDINATION_X (int)(1024)
#define COORDINATION_Y (int)(1024)
static int g_Matrix[COORDINATION_X][COORDINATION_Y];
double getTimeval()
{
struct rusage stRusage;
struct timeval stTimeval;
if (TEST_METHOD == TEST_BY_GETTIMEOFDAY)
{
gettimeofday(&stTimeval, NULL);
}
else if (TEST_METHOD == TEST_BY_GETRUSAGE)
{
getrusage(RUSAGE_SELF, &stRusage);
stTimeval = stRusage.ru_utime;
}
return stTimeval.tv_sec + (double)stTimeval.tv_usec*1E-6;
}
int main()
{
int i, j;
int n = 0;
clock_t clockT1, clockT2;
double doubleT1, doubleT2;
if (TEST_METHOD == TEST_BY_CLOCK)
{
clockT1 = clock();
}
else if (TEST_METHOD == TEST_BY_TIMES)
{
times(&clockT1);
}
else if (TEST_METHOD == TEST_BY_GETTIMEOFDAY)
{
doubleT1 = getTimeval();
}
else if (TEST_METHOD == TEST_BY_GETRUSAGE)
{
doubleT1 = getTimeval();
}
for (i = 0; i < COORDINATION_X; i++)
{
for (j = 0; j < COORDINATION_Y; j++)
{
g_Matrix[i][j] = i * j;
}
}
if (TEST_METHOD == TEST_BY_CLOCK)
{
clockT2 = clock();
printf("Time result tested by clock = %10.30f
",(double)(clockT2 - clockT1)/CLOCKS_PER_SEC);
}
else if (TEST_METHOD == TEST_BY_TIMES)
{
times(&clockT2);
printf("Time result tested by times = %10.30f
", (double)(clockT2 - clockT1)/sysconf(_SC_CLK_TCK));
}
else if (TEST_METHOD == TEST_BY_GETTIMEOFDAY)
{
doubleT2 = getTimeval();
printf("Time result tested by gettimeofday = %10.30f
",(double)(doubleT2 - doubleT1));
}
else if (TEST_METHOD == TEST_BY_GETRUSAGE)
{
doubleT2 = getTimeval();
printf("Time result tested by getrusage = %10.70f
", (double)(doubleT2 - doubleT1));
}
return 0;
}
clock :
clock ANSI C , 。
, CPU 。 , sleep , CPU , 。
, CPU , Clock Tick 。 CLOCKS_PER_SEC , ss.mmnn 。 POSIX ,CLOCKS_PER_SEC 1,000,000 , 1MHz。
, 10ms。
times :
times clock , CPU , sysconf(_SC_CLK_TCK)。
gettimeofday :
gettimeofday , 。
, 。 , 。 , dispatch , 。
getrusage :
getrusage 。 RUSAGE_SELF, 。
。
, ,getrusage gettimeofday 。 ,clock , 。