热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

linux的time命令

time命令性能监测与优化​​time命令用于统计给定命令所花费的总时间。​​语法time(参数)参数指令:指定需要运行的额指令及其参数。​​实例当测试一个程序或比较
time命令性能监测与优化 

​time命令用于统计给定命令所花费的总时间。

​语法 time(参数) 参数 指令:指定需要运行的额指令及其参数。 

​实例 当测试一个程序或比较不同算法时,执行时间是非常重要的,一个好的算法应该是用时最短的。

​所有类UNIX系统都包含time命令,使用这个命令可以统计时间消耗。
​例如:

​[root@localhost ~]# time ls 
​anaconda-ks.cfg 
​install.log 
​install.log.syslog 
​satools text 
​real 0m0.009s 
​user 0m0.002s 
​sys 0m0.007s 

​输出的信息分别显示了该命令所花费的real时间、user时间和sys时间。 

​real时间是指挂钟时间,也就是命令开始执行到结束的时间。这个短时间包括其他进程所占用的时间片,和进程被阻塞时所花费的时间。 

​user时间是指进程花费在用户模式中的CPU时间,这是唯一真正用于执行进程所花费的时间,其他进程和花费阻塞状态中的时间没有计算在内。 

​sys时间是指花费在内核模式中的CPU时间,代表在内核中执系统调用所花费的时间,这也是真正由进程使用的CPU时间。 

​shell内建也有一个time命令,当运行time时候是调用的系统内建命令,应为系统内建的功能有限,所以需要时间其他功能需要使用time命令可执行二进制文件/usr/bin/time。 

使用-o选项将执行时间写入到文件中: 

​/usr/bin/time -o outfile.txt ls 

使用-a选项追加信息: 

​/usr/bin/time -a -o outfile.txt ls 

使用-f选项格式化时间输出: 

​/usr/bin/time -f "time: %U" ls 

​-f选项后的参数: 
​参数 描述 
​%E real时间,显示格式为[小时:]分钟:秒 
​%U user时间。 
​%S sys时间。 
​%C 进行计时的命令名称和命令行参数。 
​%D 进程非共享数据区域,以KB为单位。 
​%x 命令退出状态。 
​%k 进程接收到的信号数量。 
​%w 进程被交换出主存的次数。 
​%Z 系统的页面大小,这是一个系统常量,不用系统中常量值也不同。 
​%P 进程所获取的CPU时间百分百,这个值等于user+system时间除以总共的运行时间。 
​%K 进程的平均总内存使用量(data+stack+text),单位是KB。 
​%w 进程主动进行上下文切换的次数,例如等待I/O操作完成。 
​%c 进程被迫进行上下文切换的次数(由于时间片到期)。







用途说明

time命令常用于测量一个命令的运行时间,注意不是用来显示和修改系统时间的(这是date命令干的事情)。但是今天我通过查看time命令的手册页,发现它能做的不仅仅是测量运行时间,还可以测量内存、I/O等的使用情况,手册页上的说法是time a simple command or give resource usage,其中time一词我认为它应该是测量或测定的意思,并不单指时间。一个程序在运行时使用的系统资源通常包括CPU、Memory和I/O等,其中CPU资源的统计包括实际使用时间(real time)、用户态使用时间(the process spent in user mode)、内核态使用时间(the process spent in kernel mode)。但是简单的使用time命令并不能得到内存和I/O的统计数据,请看后文慢慢道来。

常用参数

time命令最常用的使用方式就是在其后面直接跟上命令和参数:

time []

在命令执行完成之后就会打印出CPU的使用情况:

real    0m5.064s      <&#61;&#61; 实际使用时间&#xff08;real time&#xff09;
user    0m0.020s     <&#61;&#61; 用户态使用时间&#xff08;the process spent in user mode&#xff09;
sys     0m0.040s      <&#61;&#61; 内核态使用时间&#xff08;the process spent in kernel mode&#xff09;

time命令跟上-p参数可以只打印时间数值&#xff08;秒数&#xff09;&#xff0c;不打印单位。

使用示例


示例一 统计运行时间

[root&#64;web186 root]# time find . -name "mysql.sh"
./work186/sms/bin/mysql.sh
./work186/sms/src/scripts/mysql.sh
./work186/sms/src/scripts1/mysql.sh
./work186/sms1/bin/mysql.sh
./work186/sms1/src/scripts/mysql.sh
./temp/sms/bin/mysql.sh
./temp/sms/src/scripts/mysql.sh

real    0m14.837s
user    0m0.030s
sys     0m0.120s
[root&#64;web186 root]#

注&#xff1a;real远大于user加上sys&#xff0c;因为find需要遍历各个目录&#xff0c;需要大量的I/O操作&#xff0c;而磁盘I/O通常是最慢的环节&#xff0c;因此大部分时间find进程都在等待磁盘I/O完成。

[root&#64;web186 root]# time find . -name "mysql.sh"
./work186/sms/bin/mysql.sh
./work186/sms/src/scripts/mysql.sh
./work186/sms/src/scripts1/mysql.sh
./work186/sms1/bin/mysql.sh
./work186/sms1/src/scripts/mysql.sh
./temp/sms/bin/mysql.sh
./temp/sms/src/scripts/mysql.sh

real    0m0.230s
user    0m0.040s
sys     0m0.030s

注&#xff1a;再次运行的时候&#xff0c;发现real time变得很小了&#xff0c;应该是操作系统将刚才操作过的一些文件缓存了的缘故&#xff0c;因而大大减少了磁盘I/O。

[root&#64;web186 root]# time -p find . -name "mysql.sh"
./work186/sms/bin/mysql.sh
./work186/sms/src/scripts/mysql.sh
./work186/sms/src/scripts1/mysql.sh
./work186/sms1/bin/mysql.sh
./work186/sms1/src/scripts/mysql.sh
./temp/sms/bin/mysql.sh
./temp/sms/src/scripts/mysql.sh
real 0.15
user 0.04
sys 0.03

注&#xff1a;使用-p参数时&#xff0c;直接打印所需时间的数值&#xff0c;单位为秒&#xff0c;而不是更友好的格式&#xff0c;包括分钟、秒钟的显示方式。

[root&#64;web186 root]#

示例二 Linux系统中time命令其实不止一个

看过手册页的朋友&#xff0c;会发现有个-f参数可以来指定统计信息的输出格式&#xff0c;我们也来试一下。

[root&#64;web186 root]# time -f "real %f\nuser %f\nsys %f\n" find . -name "mysql.sh" 

-bash: -f: command not found

real    0m0.024s
user    0m0.000s
sys     0m0.000s

怪哉&#xff0c;不灵啊。使用type -a来看一下。使用这个shell内建命令经常会有意想不到的发现。

[root&#64;web186 root]# type -a time

time is a shell keyword
time is /usr/bin/time

注&#xff1a;通过这条命令我们可以发现我们常用的time其实是一个Shell关键字&#xff0c;还有一个外部命令/usr/bin/time&#xff0c;它有何不同呢&#xff1f;

[root&#64;web186 root]# /usr/bin/time

Usage: /usr/bin/time [-apvV] [-f format] [-o file] [--append] [--verbose]
       [--portability] [--format&#61;format] [--output&#61;file] [--version]
       [--help] command [arg...]

注&#xff1a;外部命令/usr/bin/time功能更强大&#xff0c;下面来尝试一下。

[root&#64;web186 root]# /usr/bin/time find . -name "mysql.sh"

./work186/sms/bin/mysql.sh
./work186/sms/src/scripts/mysql.sh
./work186/sms/src/scripts1/mysql.sh
./work186/sms1/bin/mysql.sh
./work186/sms1/src/scripts/mysql.sh
./temp/sms/bin/mysql.sh
./temp/sms/src/scripts/mysql.sh
0.03user 0.04system 0:00.12elapsed 55%CPU (0avgtext&#43;0avgdata 0maxresident)k
0inputs&#43;0outputs (154major&#43;63minor)pagefaults 0swaps

注&#xff1a;注意后面两行&#xff0c;打印了很多信息&#xff0c;但看不太清楚。它有一个参数-v&#xff0c;可以打印得更清楚些。

[root&#64;web186 root]# /usr/bin/time -v find . -name "mysql.sh"

./work186/sms/bin/mysql.sh
./work186/sms/src/scripts/mysql.sh
./work186/sms/src/scripts1/mysql.sh
./work186/sms1/bin/mysql.sh
./work186/sms1/src/scripts/mysql.sh
./temp/sms/bin/mysql.sh
./temp/sms/src/scripts/mysql.sh
        Command being timed: "find . -name mysql.sh"
        User time (seconds): 0.03
        System time (seconds): 0.05
        Percent of CPU this job got: 47%
        Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.17
        Average shared text size (kbytes): 0
        Average unshared data size (kbytes): 0
        Average stack size (kbytes): 0
        Average total size (kbytes): 0
        Maximum resident set size (kbytes): 0
        Average resident set size (kbytes): 0
        Major (requiring I/O) page faults: 153
        Minor (reclaiming a frame) page faults: 64
        Voluntary context switches: 0
        Involuntary context switches: 0
        Swaps: 0
        File system inputs: 0
        File system outputs: 0
        Socket messages sent: 0
        Socket messages received: 0
        Signals delivered: 0
        Page size (bytes): 4096
        Exit status: 0
[root&#64;web186 root]#

尝试完这个之后&#xff0c;我看了一下Google搜索的结果&#xff0c;发现有位大虾早已发现了这个秘密&#xff0c;见相关资料【1】。

示例三 解决time命令输出信息的重定向问题

time命令的输出信息是打印在标准错误输出上的&#xff0c; 我们通过一个简单的尝试来验证一下。

[root&#64;web186 root]# time find . -name "mysql.sh" >1.txt

real    0m0.081s
user    0m0.060s
sys     0m0.020s
[root&#64;web186 root]# time find . -name "mysql.sh" 2>2.txt
./work186/sms/bin/mysql.sh
./work186/sms/src/scripts/mysql.sh
./work186/sms/src/scripts1/mysql.sh
./work186/sms1/bin/mysql.sh
./work186/sms1/src/scripts/mysql.sh
./temp/sms/bin/mysql.sh
./temp/sms/src/scripts/mysql.sh

real    0m0.068s
user    0m0.040s
sys     0m0.030s

通过上面的尝试&#xff0c;发现无法将time的输出信息重定向到文件里面&#xff0c;为什么&#xff1f;因为time是shell的关键字&#xff0c;shell做了特殊处理&#xff0c;它会把time命令后面的命令行作为一个整体来进行处理&#xff0c;在重定向时&#xff0c;实际上是针对后面的命令来的&#xff0c;time命令本身的输出并不会被重定向的。那现在怎么办呢&#xff1f;网上提供了两种解决方法【2&#xff0c;3】&#xff0c;我们一一尝试一下。

第一种解决方法&#xff0c;就是将time命令和将要执行的命令行放到一个shell代码块中&#xff0c;也就是一对大括号中&#xff0c;要注意空格和分号的使用。

[root&#64;web186 root]# {time find . -name "mysql.sh"} 2>2.txt

好像成功了。慢&#xff0c;看一下对不对。
[root&#64;web186 root]# cat 2.txt
-bash: {time: command not found

原来bash把 {time 作为一个整体来处理了&#xff0c;前后都加上空格试试。
[root&#64;web186 root]# { time find . -name "mysql.sh" } 2>2.txt
Ctrl&#43;C

这次Bash认为命令都没有输入完成&#xff0c;少了分号。因为Bash认为后面的 } 是find命令的参数。
[root&#64;web186 root]# { time find . -name "mysql.sh"; } 2>2.txt
./work186/sms/bin/mysql.sh
./work186/sms/src/scripts/mysql.sh
./work186/sms/src/scripts1/mysql.sh
./work186/sms1/bin/mysql.sh
./work186/sms1/src/scripts/mysql.sh
./temp/sms/bin/mysql.sh
./temp/sms/src/scripts/mysql.sh
[root&#64;web186 root]# cat 2.txt

real    0m0.068s
user    0m0.030s
sys     0m0.040s

第一种方式的尝试成功了&#xff0c;总结起来就是 { time command-line; } 2>file  注意分隔符的使用。

另外一种方式就是使用子Shell的方式&#xff0c;如下所示&#xff1a;

[root&#64;web186 root]# (time find . -name "mysql.sh") 2>2.txt
./work186/sms/bin/mysql.sh
./work186/sms/src/scripts/mysql.sh
./work186/sms/src/scripts1/mysql.sh
./work186/sms1/bin/mysql.sh
./work186/sms1/src/scripts/mysql.sh
./temp/sms/bin/mysql.sh
./temp/sms/src/scripts/mysql.sh
[root&#64;web186 root]# cat 2.txt

real    0m0.083s
user    0m0.040s
sys     0m0.020s
[root&#64;web186 root]#

第二种方式的尝试也成功了&#xff0c;总结起来就是 (time command-line) 2>file 这里time紧贴着小括号(也可以的&#xff0c;命令行结束也不必带分号。当然最好还是用第一种方式&#xff0c;毕竟启动一个子shell是要多占些资源的。




推荐阅读
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了如何找到并终止在8080端口上运行的进程的方法,通过使用终端命令lsof -i :8080可以获取在该端口上运行的所有进程的输出,并使用kill命令终止指定进程的运行。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 网卡工作原理及网络知识分享
    本文介绍了网卡的工作原理,包括CSMA/CD、ARP欺骗等网络知识。网卡是负责整台计算机的网络通信,没有它,计算机将成为信息孤岛。文章通过一个对话的形式,生动形象地讲述了网卡的工作原理,并介绍了集线器Hub时代的网络构成。对于想学习网络知识的读者来说,本文是一篇不错的参考资料。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
author-avatar
信美玲小祖宗q84
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有