关于时钟时间、用户CPU时间和系统CPU时间的含义在这篇文章里有说明:linux中查看进程的时钟时间、用户CPU时间和系统CPU时间。
C语言里可以通过times函数获取这三种时间,times函数说明如下:
#include
clock_t times(struct tms *buf);
参数tms的结构如下:
struct tms {
clock_t tms_utime; /* user time */
clock_t tms_stime; /* system time */
clock_t tms_cutime; /* user time of children */
clock_t tms_cstime; /* system time of children */
};
其中时间都是以滴答数(clock tick)为单位,详细可以用man 2 times查看帮助手册。下面的示例用来计算执行系统命令date消耗的三种时间值。
#include
#include
#include
#include
int main(void)
{
//获取滴答数,在ubuntu 12.04下为100
int clktck = 0;
if ((clktck = sysconf(_SC_CLK_TCK)) < 0) {
printf("%s\n", "sysconf error");
exit(0);
}
struct tms tmsstart, tmsend;
clock_t start, end;
//获取开始时间
if ((start = times(&tmsstart)) == -1) {
printf("%s\n", "times error");
exit(0);
}
//执行系统函数date
system("date");
//获取结束时间
if ((end = times(&tmsend)) == -1) {
printf("%s\n", "times error");
exit(0);
}
printf("real: %7.2f\n", (end - start)/(double) clktck);
printf("user: %7.2f\n",
(tmsend.tms_utime - tmsstart.tms_utime)/(double) clktck);
printf("sys: %7.2f\n",
(tmsend.tms_stime - tmsstart.tms_stime)/(double) clktck);
printf("child user: %7.2f\n",
(tmsend.tms_cutime - tmsstart.tms_cutime)/(double) clktck);
printf("child sys: %7.2f\n",
(tmsend.tms_cstime - tmsstart.tms_cstime)/(double) clktck);
return 1;
}
编译执行上面的程序,输出如下:
$ ./a.out
Sun Dec 9 12:50:39 CST 2012
real: 0.01
user: 0.00
sys: 0.00
child user: 0.00
child sys: 0.00
其中child user就是执行date命令消耗的用户CPU时间,child sys就是执行date命令消耗的系统CPU时间。这里会发现这两个值都为0,因为滴答数为100,只能精确到小数点后面两位,date的执行时间非常快,所以就为0了。如何精确到小数点后面3位呢?