times() 函数 - 获取进程时间函数

  函数原型
#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 时间*/
  };

 

实例验证 times() 函数:
测试代码-1
#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);
}

运行输出
beyes@beyes-groad:~$ ./time.exe
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
上面蓝色部分的时间间隔刚好是 2s 。从上面看到,下面的时间值都是 0。为了验证问题,现在修改一下源程序
#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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值