1 前言
测试一个程序的执行时间, 时间包括用户 CPU 时间系统 CPU 时间时钟时间之前获取之前时间都是在程序的 main 函数用 time 函数实现, 这个只能粗略的计算程序的执行时间, 不能准确的获取其他时间在看 APUE 时, 书中有关程序时间测试程序, 非常正规, 提供这三个时间如是, 上网搜了一下, 进行总结一下
2 获取方法
有两种方法可以获取, 第一种是用 time 命令, time 进程第二种是通过在程序中进行记录, 首先利用 sysconf 函数获取时钟滴答数, 再用 times 获取 tms 结构
查看 times 函数, man 2 tms, 得到 tms 结构定义和 times 函数声明如下:
- 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 */
- };
- #include <sys/times.h>
- clock_t times(struct tms *buf);
注意: 此处计算的时间是时钟滴答数, 需要除以系统时钟滴答数, 得出实际的秒数
3 测试例子:
测试程序如下:
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/times.h>
- #include <unistd.h>
- #define BUFFER_SIZE 4 * 1024
- int main()
- {
- int sc_clk_tck;
- sc_clk_tck = sysconf(_SC_CLK_TCK);
- struct tms begin_tms, end_tms;
- clock_t begin, end;
- system("date");
- begin = times(&begin_tms);
- sleep(2);
- end = times(&end_tms);
- printf("real time: %lf\n", (end - begin) / (double)sc_clk_tck);
- printf("user time: %lf\n",
- (end_tms.tms_utime - begin_tms.tms_utime) / (double)sc_clk_tck);
- printf("sys time: %lf\n",
- (end_tms.tms_stime - begin_tms.tms_stime) / (double)sc_clk_tck);
- printf("child user time: %lf\n",
- (end_tms.tms_cutime - begin_tms.tms_cutime) / (double)sc_clk_tck);
- printf("child sys time: %lf\n",
- (end_tms.tms_cstime - begin_tms.tms_cstime) / (double)sc_clk_tck);
- return 0;
- }
测试结果如下所示:
采用 time 命令, 测试结果如下所示:
4 参考网址
- http://www.01happy.com/linux-process-time/
- http://www.01happy.com/c-get-process-time/
linux 查看进程的时钟时间用户 CPU 时间和系统 CPU 时间
在 linux 下进行编程时, 可能会涉及度量进程的执行时间 linux 下进程的时间值分三种:
时钟时间(real time): 指进程从开始执行到结束, 实际执行的时间
用户 CPU 时间(user CPU time): 指进程中执行用户指令所用的时间, 也包括子进程
系统 CPU 时间(system CPU time): 指为进程执行内核程序所经历的时间, 例如调用 read 和 write 内核方法时, 消耗的时间就计入系统 CPU 时间
在 linux 下, 可以使用 time 命令来查看程序执行时这三种时间值的消耗笔者写了一个测试程序, 来演示这一个过程:
- #include <stdio.h>
- int main(void)
- {
- int i;
- while (i <= 10E7) {
- i++;
- }
- return 1;
- }
程序非常简单了, 就不说明了, 编译成二进制文件 a.out, 使用 time 命令执行, 在笔者的电脑上输入如下信息:
- $ time ./a.out
- real 0m0.349s
- user 0m0.340s
- sys 0m0.004s
其中 real 表示时钟时间, user 表示用户 CPU 时间, sys 表示系统 CPU 时间 time 命令也可以用于系统的命令, 如 time lstime ps 等等
C 语言获取时钟时间用户 CPU 时间和系统 CPU 时间
C 语言里可以通过 times 函数获取这三种时间, times 函数说明如下:
- #include <sys/times.h>
- 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 <stdio.h>
- #include <sys/times.h>
- #include <unistd.h>
- #include <stdlib.h>
- 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 位呢?
来源: http://www.bubuko.com/infodetail-2506242.html