热门标签 | 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是要多占些资源的。




推荐阅读
  • 本文详细介绍了使用响应文件在静默模式下安装和配置Oracle 11g的方法。硬件要求包括:内存至少1GB,具体可通过命令`grep -i memtotal /proc/meminfo`进行检查。此外,还提供了详细的步骤和注意事项,确保安装过程顺利进行。 ... [详细]
  • 数字图书馆近期展出了一批精选的Linux经典著作,这些书籍虽然部分较为陈旧,但依然具有重要的参考价值。如需转载相关内容,请务必注明来源:小文论坛(http://www.xiaowenbbs.com)。 ... [详细]
  • 本文详细介绍了在 Ubuntu 系统上搭建 Hadoop 集群时遇到的 SSH 密钥认证问题及其解决方案。通过本文,读者可以了解如何在多台虚拟机之间实现无密码 SSH 登录,从而顺利启动 Hadoop 集群。 ... [详细]
  • Linux CentOS 7 安装PostgreSQL 9.5.17 (源码编译)
    近日需要将PostgreSQL数据库从Windows中迁移到Linux中,LinuxCentOS7安装PostgreSQL9.5.17安装过程特此记录。安装环境&#x ... [详细]
  • 本文详细介绍了如何在 Django 项目中使用 Admin 管理后台,包括创建超级用户、启动项目、管理数据模型和修改用户密码等步骤。 ... [详细]
  • SecureCRT是一款功能强大的终端仿真软件,支持SSH1和SSH2协议,适用于在Windows环境下高效连接和管理Linux服务器。该工具不仅提供了稳定的连接性能,还具备丰富的配置选项,能够满足不同用户的需求。通过SecureCRT,用户可以轻松实现对远程Linux系统的安全访问和操作。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • Amoeba 通过优化 MySQL 的读写分离功能显著提升了数据库性能。作为一款基于 MySQL 协议的代理工具,Amoeba 能够高效地处理应用程序的请求,并根据预设的规则将 SQL 请求智能地分配到不同的数据库实例,从而实现负载均衡和高可用性。该方案不仅提高了系统的并发处理能力,还有效减少了主数据库的负担,确保了数据的一致性和可靠性。 ... [详细]
  • 在开发过程中,我最初也依赖于功能全面但操作繁琐的集成开发环境(IDE),如Borland Delphi 和 Microsoft Visual Studio。然而,随着对高效开发的追求,我逐渐转向了更加轻量级和灵活的工具组合。通过 CLIfe,我构建了一个高度定制化的开发环境,不仅提高了代码编写效率,还简化了项目管理流程。这一配置结合了多种强大的命令行工具和插件,使我在日常开发中能够更加得心应手。 ... [详细]
  • Linux Shell变量初探:初始值解析与使用指南
    本文探讨了Linux Shell中变量的基本概念及其在BASH中的应用。变量是用于存储可变数据的标识符,能够代表不同的值。文章详细介绍了BASH shell的主要优势,包括强大的命令编辑能力、自动补全功能、命令别名设置、作业控制以及前后台任务管理。此外,还涵盖了编程脚本编写和通配符的使用方法,为初学者提供了全面的指导。 ... [详细]
  • FastDFS Nginx 扩展模块的源代码解析与技术剖析
    FastDFS Nginx 扩展模块的源代码解析与技术剖析 ... [详细]
  • Shell参数详解与应用
    本文详细介绍了Shell参数的种类及其应用,内容简洁明了,结构清晰。通过深入解析各类参数的功能和使用方法,旨在帮助读者更好地理解和掌握Shell编程技巧,提升实际操作能力。 ... [详细]
  • Python与R语言在功能和应用场景上各有优势。尽管R语言在统计分析和数据可视化方面具有更强的专业性,但Python作为一种通用编程语言,适用于更广泛的领域,包括Web开发、自动化脚本和机器学习等。对于初学者而言,Python的学习曲线更为平缓,上手更加容易。此外,Python拥有庞大的社区支持和丰富的第三方库,使其在实际应用中更具灵活性和扩展性。 ... [详细]
  • 在CentOS上部署和配置FreeSWITCH
    在CentOS系统上部署和配置FreeSWITCH的过程涉及多个步骤。本文详细介绍了从源代码安装FreeSWITCH的方法,包括必要的依赖项安装、编译和配置过程。此外,还提供了常见的配置选项和故障排除技巧,帮助用户顺利完成部署并确保系统的稳定运行。 ... [详细]
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社区 版权所有