在Linux上使用时间统计程序运行时间

介绍

这篇文章主要讲解了“在Linux上使用时间统计程序运行时间”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“在Linux上使用时间统计程序运行时间”吧!

1基础用法详解

先来看下最基础的用法,也可能是大家最常见的用法了

 root@chopin: ~,美元time  find 只-name “chopin.txt",……, real ,, 0 m0.174s  user ,, 0 m0.084s  sys ,,, 0 m0.084s 

可以很清楚看到,找到命令执行的时间为0.174 s,是不是很简单,很方便呢

不过,时间命令输出了三个参数,我们只用到了第一个参数,其它两个参数代表什么含义呢?

这里我来解释一下:

<李>

真实:表示的是墙上时间,说白了,其实就是从程序运行开始到结束所经历的时间,

<李>

用户:表示程序运行期间,cpu在用户态所花费的时间,

<李>

sys:表示程序运行期间,cpu在内核态所花费的时间,

细心的读者会发现,上述案例中的用户+ sys不等于真实,这是怎么回事呢?

其实上边解释的用户和系统,是cpu执行指令所消耗的时间,并不包含:进程阻塞IO、调度排队,这些非cpu运行时间。

案例中找到执行查找文件过程中,会有磁盘IO读取,这时cpu会被释放出来干别的事情,这些IO消耗的时间,是不包含在用户和系统,统计数据中,所以就出现了真正的时间大于用户+ sys了。

再通过一个示例来验证并加强我们的理解

 root@chopin: ~,美元time  sleep  2, real ,, 0 m2.001s  user ,, 0 m0.000s  sys ,,, 0 m0.000s 

可以清楚地看的到,睡眠命令基本上没有消耗cpu、程序真实的运行时间就是2秒

那我们是不是可以得出如下结论了呢:

 real 祝辞=,user  +, sys 

其实这个结论在单个cpu的情况下,是正确的。

如果服务器是多个cpu、你的程序正好可以将多个cpu充分利用起来,程序运行期间是多核心并行的,那么用户+系统统计的cpu,时间可能就会大于真正的时间啦

所以这3个时间之间的关系并不是恒定的,你需要清楚的了解服务器是否为多个核心。

通过统计到cpu的消耗时间,我们也可以大概知道,程序运行期间cpu利用情况。对于单核,计算密集型的程序,真正会很接近用户和系统,时间之和的。

提示:有些同学可能对操作系统可能不太熟悉,这里简单科普下内核态和用户态的基本概念

Linux为使系统更稳定,采取了隔离保护的措施,运行状态分为内核态和用户态:

<李>

用户态:用户代码不具备直接访问底层资源的能力,需要借助内核提供的系统调用API。在这种隔离保护下,即使用户程序崩溃,也不会影响整个系统的功能。

<李>

内核态:内核代码具备最大权限,可执行任意cpu,指令,不受任何限制。内核态通常是操作系统提供的最底层,最可靠的代码运行的,内核态的代码崩溃是灾难性的,影响整个系统的正常运行。

2你运行的可能是假时间

还有其它功能吗?看一下帮助文档吧

 root@chopin: ~,美元time ——help ——帮助:,command  not  found  real  0 m0.129s  user  0 m0.084s  sys  0 m0.036s 

竟然报错,将——帮助当成了命令来执行了,难道时间就这么点能耐吗?

好吧,我也不卖关子了,直接说答案:你运行的可能是假时间。你可能有点懵逼,怎么就假的了。

其实在Linux系统上,使用时间时,你可能会遇到三种版本:

 #, 1只Bash  time  is  a  shell  keyword  #, 2只Zsh  time  is  a  reserved  word  #, 3只GNU  time  time  is /usr/bin/时间

我们当前壳是Bash,可以通过类型命令

 root@chopin: ~,美元type  time  time  is  a  shell 关键字

可以看的到,我们刚才执行的时间是壳的内置命令,如果你用的是zsh,默认使用的时间也是对应内置命令。

GNU时间命令路径是/usr/bin/time,一般的Linux发行版都带有这个命令,它才是我们今天的猪脚。

3更强大的功能

GNU时间命令提供了更强大的功能:

更详细的统计信息

更丰富的格式输出

支持保存统计数据到文件

下边我们来学习写GNU时间的使用

<强> 1。最简单的用法

 root@chopin: ~,美元/usr/bin/time  sleep  2, 0.00 user  0.00 system  0:02.00elapsed  0% cpu  (0 avgtext + 0 avgdata  1784 maxresident) k 输入0 + 0 outputs (0 + 72小)主要pagefaults  

在Linux上使用时间统计程序运行时间