times() 函数 - 获取进程时间函数
来源:互联网 发布:数据库设计各阶段任务 编辑:程序博客网 时间:2024/05/23 02:24
#include <sys/times.h>clock_t times(struct tms *buf);
函数功能:
获取进程时间。
说明:
times() 函数返回从过去一个任意的时间点所经过的时钟数。返回值可能会超出 clock_t (一般为 long 型) 的范围(溢出)。如果发生错误,则返回 (clock_t ) -1 类型,然后设置相应的 errno 值。
系统每秒的时钟可以通过 sysconf(_SC_CLK_TCK); 函数获得。关于 sysconf() 函数的详细信息见:http://www.groad.net/bbs/read.php?tid-1485.html
上面 _SC_CLK_TCK 的值为 2,因为它在 /usr/include/bits/confname.h 头文件的一个枚举类型里定义。
struct tms 结构体定义在 <sys/times.h> 头文件里,具体定义如下:
/* Structure describing CPU time used by a process and its children. */struct tms { clock_t tms_utime; /* User CPU time. 用户程序 CPU 时间*/ clock_t tms_stime; /* System CPU time. 系统调用所耗费的 CPU 时间 */ clock_t tms_cutime; /* User CPU time of dead children. 已死掉子进程的 CPU 时间*/ clock_t tms_cstime; /* System CPU time of dead children. 已死掉子进程所耗费的系统调用 CPU 时间*/ };
#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <sys/times.h>int main(){ struct tms time_buf_head, time_buf_end; long tck = 0; clock_t time_head, time_end; tck = sysconf (_SC_CLK_TCK); /*获取系统时钟(1秒里有多少个)*/ time_head = times( &time_buf_head ); /*进程运行到此时的系统时钟数(总的)*/ printf ("head_time is : %f\n", time_head / (double)tck); /*此时进程所处的时间点(单位为秒)*/ //system ("./time_test.exe"); system ("sleep 2"); /*睡眠2秒*/ time_end = times( &time_buf_end ); /*进程到此时的系统时钟数*/ printf ("end_time is : %f\n", time_end / (double)tck); /*此时进程所处的时间点(单位为秒)*/ printf ("user time is : %f\n", ((time_buf_end.tms_utime - time_buf_head.tms_utime) / (double)tck)); /*打印出用户进程到此所经历时间*/ printf ("systime time is : %f\n", ((time_buf_end.tms_stime - time_buf_head.tms_stime) / (double)tck)); printf ("child user time is : %f\n", ((time_buf_end.tms_cutime - time_buf_head.tms_cutime) / (double)tck)); printf ("child sys time is : %f\n", ((time_buf_end.tms_cstime - time_buf_head.tms_cstime) / (double)tck)); return (0);}
运行输出:
head_time is : 17236892.770000
end_time is : 17236894.790000
user time is : 0.000000
systime time is : 0.000000
child user time is : 0.000000
child sys time is : 0.000000
#include <sys/types.h>#include <sys/stat.h>#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <fcntl.h>#include <sys/times.h>int main(){ struct tms time_buf_head, time_buf_end; long tck = 0; clock_t time_head, time_end; int i; int j; tck = sysconf (_SC_CLK_TCK); time_head = times( &time_buf_head ); printf ("head_time is : %f\n", time_head / (double)tck); /*延迟测试用*/ for (i = 0; i < 20000; i++) for (j = 0; j < 20000; j++) { ; } time_end = times( &time_buf_end ); printf ("end_time is : %f\n", time_end / (double)tck); printf ("user time is : %f\n", ((time_buf_end.tms_utime - time_buf_head.tms_utime) / (double)tck)); /*用户进程所耗费的时间*/ printf ("systime time is : %f\n", ((time_buf_end.tms_stime - time_buf_head.tms_stime) / (double)tck)); printf ("child user time is : %f\n", ((time_buf_end.tms_cutime - time_buf_head.tms_cutime) / (double)tck)); printf ("child sys time is : %f\n", ((time_buf_end.tms_cstime - time_buf_head.tms_cstime) / (double)tck)); return (0);}
再次运行输出:
beyes@beyes-groad:~$ ./time.exe
head_time is : 17184643.070000
end_time is : 17184644.280000
user time is : 1.200000
systime time is : 0.000000
child user time is : 0.000000
child sys time is : 0.000000
由于使用了大量的延迟,这时可以看到 user time 里耗费了 1.2s ,而 end_time 和 head_time 的时间间隔为 1.21s 约等于 1.2s 。
再来修改一下代码:
#include <sys/types.h>#include <sys/stat.h>#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <fcntl.h>#include <sys/times.h>int main(){ struct tms time_buf_head, time_buf_end; long tck = 0; clock_t time_head, time_end; int i; int j; tck = sysconf (_SC_CLK_TCK); time_head = times( &time_buf_head ); printf ("head_time is : %f\n", time_head / (double)tck); for (i = 0; i < 1000; i++) for (j = 0; j < 1000; j++) { open ("Cannon-1.txt", O_RDONLY); } time_end = times( &time_buf_end ); printf ("end_time is : %f\n", time_end / (double)tck); printf ("user time is : %f\n", ((time_buf_end.tms_utime - time_buf_head.tms_utime) / (double)tck)); printf ("systime time is : %f\n", ((time_buf_end.tms_stime - time_buf_head.tms_stime) / (double)tck)); printf ("child user time is : %f\n", ((time_buf_end.tms_cutime - time_buf_head.tms_cutime) / (double)tck)); printf ("child sys time is : %f\n", ((time_buf_end.tms_cstime - time_buf_head.tms_cstime) / (double)tck)); return (0);}
运行输出:
beyes@beyes-groad:~$ ./time.exe
head_time is : 17189923.210000
end_time is : 17189923.650000
user time is : 0.160000
systime time is : 0.280000
child user time is : 0.000000
child sys time is : 0.000000
在上面的输出中可以看到,systime time 这时不再为 0,这是因为程序中使用了 open() 这个系统调用的结果,它在两个 for 循环里一共被调用了 1000*1000次,总耗时为0.28s ,而执行这两个 for 的时间为 0.16s ,两个时间加起来的时间间隔正好为 end_time - head_time = 0.44s 。
下面测试子进程的时间,也就是 child user time 和 child sys time 两个。这里,需要另外一个程序,它的主要作用就是和上面一样的调用 open() 打开一个在本目录下的一文本文件,代码如下:
#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>int main(){ int i; int j; for (i = 0; i < 1000; i++) for (j = 0; j < 1000; j++) { open ("Cannon-1.txt", O_RDONLY); } return (0);}
上面的程序命名为 time_test.exe ,它会在主程序里被 system() 函数调用到,修改主程序如下:
#include <sys/types.h>#include <sys/stat.h>#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <fcntl.h>#include <sys/times.h>int main(){ struct tms time_buf_head, time_buf_end; long tck = 0; clock_t time_head, time_end; int i; int j; tck = sysconf (_SC_CLK_TCK); time_head = times( &time_buf_head ); printf ("head_time is : %f\n", time_head / (double)tck); system ("./time_test.exe"); time_end = times( &time_buf_end ); printf ("end_time is : %f\n", time_end / (double)tck); printf ("user time is : %f\n", ((time_buf_end.tms_utime - time_buf_head.tms_utime) / (double)tck)); printf ("systime time is : %f\n", ((time_buf_end.tms_stime - time_buf_head.tms_stime) / (double)tck)); printf ("child user time is : %f\n", ((time_buf_end.tms_cutime - time_buf_head.tms_cutime) / (double)tck)); printf ("child sys time is : %f\n", ((time_buf_end.tms_cstime - time_buf_head.tms_cstime) / (double)tck)); return (0);}
运行输出:
beyes@beyes-groad:~$ ./time.exe
head_time is : 17190766.590000
end_time is : 17190767.060000
user time is : 0.000000
systime time is : 0.000000
child user time is : 0.140000
child sys time is : 0.300000
由上可见,child user time 和 child sys time 两者的时间也是为 0.44s,这和上面是一样的,这是因为程序的内容相同。
转载:http://www.groad.net/bbs/read.php?tid-1499.html
- times() 函数 - 获取进程时间函数
- times() 函数 | 获取进程时间函数
- times函数
- linux times函数分析。
- linux系统编程之进程(四):wait/waitpid函数与僵尸进程、fork 2 times
- linux系统编程之进程(四):wait/waitpid函数与僵尸进程、fork 2 times
- 标量函数获取时间
- SQL获取时间函数
- linux5 获取时间函数
- 获取时间函数
- 获取系统时间函数
- 获取时间函数
- C++获取时间函数
- Windows获取时间函数
- 获取时间函数
- CFAbsoluteTime 获取函数时间
- MySQL获取时间函数
- 获取系统时间函数
- 新装ubuntu时出现的一系列安装问题
- Oracle SQL优化 总结
- ExtJS带验证码登录框[新增回车提交]
- ajax如何逐级分层对应获取xml文档数据?
- BASH系列之六case语句
- times() 函数 - 获取进程时间函数
- web 动画
- jsp获取客户端真实ip地址
- 网桥的自学习算法
- 什么是AP
- DevExpress的Xtragrid合并同列相同值的行
- linux安装qt
- Ogre中实时切换多个模型
- 使用XFire+Spring构建Web Service(一)——helloWorld篇