在Linux中使用 times函数 和 close函数 两种方式 打印进程时间。
times函数用于获取当前进程时间,其函数原型如下所示:
#include <sys/times.h>
clock_t times(struct tms *buf); //使用该函数需要包含头文件<sys/times.h>。
函数参数和返回值含义如下:
buf:times()会将当前进程时间信息存在一个 struct tms 结构体数据中,所以我们需要提供 struct tms 变量,使用参数 buf 指向该变量 。
返回值:返回值类型为 clock_t(实质是 long 类型),调用成功情况下,将返回从过去任意的一个时间点(譬如系统启动时间)所经过的时钟滴答数(其实就是系统节拍数),将(节拍数 / 节拍率)便可得到秒数,返回值可能会超过 clock_t 所能表示的范围(溢出);调用失败返回-1,并设置 errno。
如果我们想查看程序运行到某一个位置时的进程时间,或者计算出程序中的某一段代码执行过程所花费的进程时间,都可以使用 times()函数来实现。
struct tms {
clock_t tms_utime; /* user time, 进程的用户 CPU 时间, tms_utime 个系统节拍数 */clock_t tms_stime; /* system time, 进程的系统 CPU 时间, tms_stime 个系统节拍数 */
clock_t tms_cutime; /* user time of children, 已死掉子进程的 tms_utime + tms_cutime 时间总和 */
clock_t tms_cstime; /* system time of children, 已死掉子进程的 tms_stime + tms_cstime 时间总和 */
};
代码示例:
#include<stdio.h>
#include<stdlib.h>
#include<sys/times.h>
#include<unistd.h>int main(int argc ,char *agrv[])
{struct tms t_buf_start;struct tms t_buf_end;clock_t t_start; clock_t t_end;long tck;int i , j;/*获取系统的节拍率*/tck = sysconf(_SC_CLK_TCK);/*开始时间*/t_start = times(&t_buf_start);if (-1 == t_start){perror("times error\n");exit(-1);}/*需要测试的代码段*/for ( i = 0; i < 20000; i++){// }for ( j = 0; j < 20000; j++){/* code */}sleep(1); //休眠挂起/*结束时间*/t_end = times(& t_buf_end);if (-1 == t_end){/* code */perror("times error\n");exit(-1);}/*打印时间*/printf("时间总和: %f 秒\n", (t_end - t_start) / (double)tck);printf("用户 CPU 时间: %f 秒\n", (t_buf_end.tms_utime - t_buf_start.tms_utime) / (double)tck);printf("系统 CPU 时间: %f 秒\n", (t_buf_end.tms_stime - t_buf_start.tms_stime) / (double)tck);exit(0);}
运行结果:
clock 函数
库函数 clock()提供了一个更为简单的方式用于进程时间,它的返回值描述了进程使用的总的 CPU 时间(也就是进程时间,包括用户 CPU 时间和系统 CPU 时间),其函数原型如下所示:
#include <time.h>
clock_t clock(void);使用该函数需要包含头文件<time.h>。
函数参数和返回值含义如下:
无参数。
返回值:返回值是到目前为止程序的进程时间,为 clock_t 类型,注意 clock()的返回值并不是系统节拍
数,如果想要获得秒数,请除以 CLOCKS_PER_SEC(这是一个宏)。如果返回的进程时间不可用或其值无
法表示,则该返回值是-1。
clock()函数虽然可以很方便的获取总的进程时间,但并不能获取到单独的用户 CPU 时间和系统 CPU 时
间,在实际编程当中,根据自己的需要选择。
代码示例:
#include<stdio.h>
#include<stdlib.h>
#include<sys/times.h>
#include<unistd.h>#define CLOCKS_PER_SEC ((__clock_t) 1000000)
int clock();
int main(int argc ,char *agrv[])
{struct tms t_buf_start;struct tms t_buf_end;clock_t t_start; clock_t t_end;long tck;int i , j;/* 开始时间 */t_start = clock();if (-1 == t_start)exit(-1);/* *****需要进行测试的代码段***** */for (i = 0; i < 20000; i++)for (j = 0; j < 20000; j++);/* *************end************** *//* 结束时间 */t_end = clock();if (-1 == t_end)exit(-1);/* 打印时间 */
printf("总的 CPU 时间: %f\n", (t_end - t_start) / (double)CLOCKS_PER_SEC);
exit(0);
}
运行结果: