time命令_Linux time命令:测量命令的执行时间或者系统资源的使用情况(转)
原文地址:http://m.biancheng.net/linux/time.html
这里我们要学习的 time 命令是用来测量 Linux 程序执行时间的命令,而不是用来显示系统时间的命令。不是吧,这也太分裂了吧,那显示系统时间的命令是什么呢?是 date,马上百度一下,你就清楚了。
Linux 手册中是这样介绍 time 命令的:“time a simple command or give resource usage”,即测量命令的执行时间,或者给出系统资源的使用情况。
time 的简单用法
如果你想查看一条命令(比如 ls)到底执行了多长时间,我们可以这样做:
[roc@roclinux ~]$ time ls
program public_html repo rocscm real 0m0.002s
user 0m0.002s
sys 0m0.000s
看到没有,执行时间一下子就统计出来了。但输出内容中有三个统计时间,real、user 和 sys,它们都代表什么含义呢?哪个才是 ls 命令的执行时间呢?下面我们就一起来看看这三个统计时间。
(1) real:从进程 ls 开始执行到完成所耗费的 CPU 总时间。该时间包括 ls 进程执行时实际使用的 CPU 时间,ls 进程耗费在阻塞上的时间(如等待完成 I/O 操作)和其他进程所耗费的时间(Linux 是多进程系统,ls 在执行过程中,可能会有别的进程抢占 CPU)。
(2) user:进程 ls 执行用户态代码所耗费的 CPU 时间。该时间仅指 ls 进程执行时实际使用的 CPU 时间,而不包括其他进程所使用的时间和本进程阻塞的时间。
(3) sys:进程 ls 在内核态运行所耗费的 CPU 时间,即执行内核系统调用所耗费的 CPU 时间。
现在,我们应该对这三个时间非常清楚了吧。ls 命令的真正执行时间是多少?答案就是 user+sys 的时间,但一般情况下,real=user+sys,因而我们就使用 real 的时间作为 ls 的执行时间了(注意,这里会有几个坑,我们将在后面进行介绍)。
好了,time 的最基本用法介绍完毕,就这么简单。
消失的时间
上面说 real 时间中会有几个坑,下面我们就来详细地看一看。
情景一:
[roc@roclinux ~]$ time sudo find / -name php.ini real 0m0.193s
user 0m0.076s
sys 0m0.115s
咦,是我数学不好,还是命令执行出错了呢?为什么 0.193s(real)>0.076s(user)+0.115s(sys),而不是相等呢?哈哈,同学,你挺细心的嘛。这既不是你的数学不好,也不是命令执行出错,而是我们对命令执行时间的理解有几个误区。
误区一:
real_time=user_time+sys_time
如果你认为上面的等式一定成立的话,那么请你再理解一下前面关于 real、user 和 sys 的介绍。在前面的表述中,real time 是包含了其他进程的执行时间和进程阻塞时间的,而 usr time+sys time 显然是不包括其他进程的执行时间和进程阻塞时间的。因此,real_time>user_time+sys_time 是非常有可能的。
误区二:
real_time>user_time+sys_time
根据上面的分析,这个关系式应该是成立的吧?嘿嘿,不一定哟。一般来说,在单核 CPU 系统中,这个关系式是成立的,但如果我们的系统是多核 CPU 的话,而有些程序是能够同时利用到多核 CPU 的计算能力的,在这种情况下这个关系式就不成立了。
程序利用多核 CPU 的计算能力,可以并行地处理多项事务。就像一件工作,原来是一个 CPU 核去做,现在是两个 CPU 核并行做,那么完成同样工作所花费的总时间是 user_time+sys_time,而两个人并行做却能够在更短的时间内完成,耗时为 real_time。因此,这种情况下,便出现了 real_time<user_time+sys_time 的情况。
误区三:
real_time<user_time+sys_time
多核情况下,real_time<user_time+sys_time 是成立的,那单核呢?显然是 real_time>user_time+sys_time。
上面的三个误区有点绕,但结论很重要,就是 real_time 和 user_time+sys_time 的大小关系不是恒久不变的,你需要了解你的 Linux 服务器,是单核,还是多核,这样才能正确地确定它们的关系。
情景二:
[roc@roclinux ~]$ time sudo find / -name mysql.sh
/etc/profile.d/mysql.sh real 0m6.776s
user 0m1.101s
sys 0m1.363s
我们执行 find/-name mysql.sh 搜索文件的命令,显示的命令耗时是 6.776 秒。
如果我们再执行一次完全相同的命令:
[roc@roclinux ~]$ time sudo find / -name mysql.sh
/etc/profile.d/mysql.sh real 0m3.059s
user 0m1.189s
sys 0m1.435s
咦,怎么 real 的时间缩减到了 3.059 秒了,生生少了 3 秒多钟,这又是怎么回事呢?为什么同样的命令在第二次执行时快这么多呢?
这个现象跟 Linux 操作系统的运行原理有关,find 命令在第一次执行后,系统会对一些文件做缓存,在第二次执行时,就正好使用到了这些缓存中的数据,因此执行速度就变快了很多。
看过这个示例后,如果仍有同学不问青红皂白地抱怨 time 命令的计时误差大,那可真是冤枉 time 啦。
time 的 man 手册中说,它不仅可以测量运行时间,还可以测量内存、I/O 等的使用情况,但为什么上面示例中的 time 命令的结果中却没有显示出这些信息呢?难道是 man 手册出现了错误?
NO,NO,NO(重要的事情要说三遍),其实上面使用的 time 真的是“巧妇难为无米之炊”,我们之前所用的 time 命令是 Bash 的内置命令,功能比较弱;而更强大的 time 命令隐藏在 /usr/bin/ 目录下,这个命令才是世外高人。
如果我们在 /user/bin/ 中并没有找到传说中那个强大的 time 命令,那么应该是没有安装 time 这个工具,安装方法也很简单:
[root@roclinux ~]# yum install time
安装完成后,我们就一起来见识 time 命令的庐山真面目吧!我们特意在 time 命令前加了一个斜线(\),就是为了调用那个强大的 time 命令,而非 Bash 内置的 time 命令。
[root@roclinux ~]# \time ls
bin dev lib media proc seLinux tmp
boot etc lib64 mnt root srv usr
cgroup home lost+found opt sbin sys var
.00user .00system :.00elapsed %CPU (0avgtext+0avgdata 956maxresident)k
0inputs+0outputs (0major+289minor)pagefaults 0swaps
请注意输出内容中的最后两行,打印了很多指标数据,但似乎有点晦涩难懂。这时我们可以使用一个 -v 选项,这样可以打印出更详细的信息。
[root@roclinux /]# \time -v ls
bin dev lib media proc seLinux tmp
boot etc lib64 mnt root srv usr
cgroup home lost+found opt sbin sys var
Command being timed: "ls"
User time (seconds): 0.00
System time (seconds): 0.00
Percent of CPU this job got: %
Elapsed (wall clock) time (h:mm:ss or m:ss): :00.00
Average shared text size (kbytes):
Average unshared data size (kbytes):
Average stack size (kbytes):
Average total size (kbytes):
Maximum resident set size (kbytes):
Average resident set size (kbytes):
Major (requiring I/O) page faults:
Minor (reclaiming a frame) page faults:
Voluntary context switches:
Involuntary context switches:
Swaps:
File system inputs:
File system outputs:
Socket messages sent:
Socket messages received:
Signals delivered:
Page size (bytes):
Exit status:
注意,上面的 Elapsed(wall clock)time(h:mm:ss or m:ss):0:00.00,值是 0,难道执行 ls 命令没有消耗时间?
非也,事情的真相是这样的:在 time 命令的输出中,Elapsed time 是通过系统调用 gettimeofday 获取到的结束时间和起始时间相减得到的。因此,time 对于运行时间较短的任务计时时,会产生一定误差。time 命令输出的时间统计精度基本在 10 毫秒级。
原来是精度的问题啊,少于 10 毫秒的程序,真的是连 time 也无法精确计时。
time 命令输出指标介绍
time 命令可以显示的资源共有三大项,分别是:时间、内存和 I/O。下面来具体看看 time 命令都显示了哪些指标数据。
time命令_Linux time命令:测量命令的执行时间或者系统资源的使用情况(转)的更多相关文章
- (办公)记事本_linux关机和重启命令
参考谷粒学院的linux视频教程:http://www.gulixueyuan.com/course/300/task/7091/show .sync Linux sync命令用于数据同步,sync命 ...
- xargs命令_Linux xargs命令:一个给其他命令传递参数的过滤器
本文要为大家介绍的命令是 xargs,我们把它称为护花使者,因为它总是乐于协助其他的命令来完成一些事情.下面一起来看看它是如何护花的. xargs 是 execute arguments 的缩写,它的 ...
- history附上时间戳,history命令_Linux history命令:查看和执行历史命令
起因是这样的,一台机器客户反馈连接不上,说没有任何操作.好吧,排查吧. 1.第一步先看网络是否通: 从图中可以看到一开始是一直不通的.然后就通了,问了客户有没操作重启什么的结果说没有任何操作,还让给个 ...
- Android系统在超级终端下必会的命令大全(adb shell命令大全)
. 显示系统中全部Android平台: android list targets . 显示系统中全部AVD(模拟器): android list avd . 创建AVD(模拟器): android c ...
- [linux time命令学习篇] time 统计命令执行的时间
注意: 命令后面一定要有分号; http://codingstandards.iteye.com/blog/798788 用途说明 time命令常用于测量一个命令的运行时间,注意不是用来显示和修改系统 ...
- Linux命令详解之—tail命令
tail命令也是一个非常常用的文件查看类的命令,今天就为大家介绍下Linux tail命令的用法. 更多Linux命令详情请看:Linux命令速查手册 Linux tail命令主要用来从指定点开始将文 ...
- Linux命令学习总结:pwd命令
命令简介: 该命令用来显示目前所在的工作目录.指令英文原义:print work directory 执行权限 :All User 指令所在路径:/usr/bin/pwd 或 /bin/pwd ...
- Linux常用命令学习2---(文件搜索命令locate find、命令搜索命令whereis which、字符串搜索命令grep、帮助命令man)
1.文件搜索命令:locate [文件名] 在后台数据库中按文件名搜索,搜索速度比find快,耗费资源更少 例子:locate test.txt,就会显示文件名包含 test.txt的所 ...
- Linux命令详解之—less命令
Linux下还有一个与more命令非常类似的命令--less命令,相比于more命令,less命令更加灵活强大一些,今天就给大家介绍下Linux下的less命令. 更多Linux命令详情请看:Linu ...
随机推荐
- linux中apt-get使用
apt-get简介 在Ubuntu系统中,经常要用到apt-get install指令来安装软件,由于常常需要root权限来操作,所以搭配sudo食用口感更佳,apt-get指令对于安装.卸载.升级软 ...
- 【HCIA Gauss】学习汇总-数据库管理(事务 权限 审计 OBDC JDBC)-6
事务控制事务提交 commit事务回滚 rollback savepoint 用于事务设置保存点 ----> savepoint s1 / savepoint s2 rollback to sa ...
- linux下给U盘分区&制作文件系统
这几天读到TLCL-Storage Media一节,不由的想要折腾一下U盘,一直以来U盘只是被拿来暂存数据,其内部有没有文件系统,数据怎么管理,那是从来也不清楚,本文就依葫芦画瓢,折腾下手中的King ...
- PAT甲级1002水题飘过
#include<iostream> #include<string.h> using namespace std; ]; int main(){ int n1, n2; wh ...
- Codeforces D. Intercity Travelling(区间组合)
题目描述: D. Intercity Travelling time limit per test 1.5 seconds memory limit per test 256 megabytes in ...
- The 16th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple (Mirror)
B题 思路 因为 \[ x=\sum\limits_{k=1}^{n}ka_k\\ y=\sum\limits_{k=1}^{n}ka_{k}^{2} \] 我们设交换前和交换后的这两个等式的值设为\ ...
- 使用flask搭建微信公众号:实现签到功能
终于到了实战阶段.用微信公众号实现一个简单的签到功能. 前情提要: 微信公众号token验证失败 使用flask搭建微信公众号:完成token的验证 使用flask搭建微信公众号:接收与回复消息 程序 ...
- Spark 基础 —— 创建 DataFrame 的三种方式
1.自定义 schema(Rdd[Row] => DataSet[Row]) import org.apache.spark.sql.types._ val peopleRDD = spark. ...
- selenium模块及类组织关系
问题:webdriver子模块中为什么可以直接使用类Chrome.ChromeOptions.Firefox.FirefoxProfile... 在webdriver的__init__.py文件中已经 ...
- CLR如何将SEH异常映射到托管异常类型
托管异常处理构建在Windows操作系统的结构化异常处理之上,通常称为SEH.这意味着CLR了解如何在SEH和托管异常系统之间进行互操作,这是一个非常关键的点,因为SEH基于异常代码的概念,而托管异常 ...