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



函数原型

引用

#include <sys/times.h> 
clock_t  times (struct  tms * buf



函数功能

获取进程时间。


说明

times() 函数返回从过去一个任意的时间点所经过的时钟数。返回值可能会超出 clock_t  (一般为 long 型) 的范围(溢出)。如果发生错误,则返回 (clock_t ) -1 类型,然后设置相应的 errno 值。


系统每秒的时钟可以通过 sysconf(_SC_CLK_TCK); 函数获得。


上面 _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,这和上面是一样的,这是因为程序的内容相同。