linux time 和/usr/bin/time

2023-11-15

http://codingstandards.iteye.com/blog/798788

用途说明

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 <command> [<arguments...>]

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

real    0m5.064s      <== 实际使用时间(real time)
user    0m0.020s     <== 用户态使用时间(the process spent in user mode)
sys     0m0.040s      <== 内核态使用时间(the process spent in kernel mode)

time命令跟上-p参数可以只打印时间数值(秒数),不打印单位。

使用示例

示例一 统计运行时间

[root@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@web186 root]#

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

[root@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

注:再次运行的时候,发现real time变得很小了,应该是操作系统将刚才操作过的一些文件缓存了的缘故,因而大大减少了磁盘I/O。
[root@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

注:使用-p参数时,直接打印所需时间的数值,单位为秒,而不是更友好的格式,包括分钟、秒钟的显示方式。
[root@web186 root]#

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

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

[root@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

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

[root@web186 root]# type -a time
time is a shell keyword
time is /usr/bin/time

注:通过这条命令我们可以发现我们常用的time其实是一个Shell关键字,还有一个外部命令/usr/bin/time,它有何不同呢?
[root@web186 root]# /usr/bin/time
Usage: /usr/bin/time [-apvV] [-f format] [-o file] [--append] [--verbose]
       [--portability] [--format=format] [--output=file] [--version]
       [--help] command [arg...]

注:外部命令/usr/bin/time功能更强大,下面来尝试一下。

[root@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+0avgdata 0maxresident)k
0inputs+0outputs (154major+63minor)pagefaults 0swaps

注:注意后面两行,打印了很多信息,但看不太清楚。它有一个参数-v,可以打印得更清楚些。
[root@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@web186 root]#

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

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

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

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

real    0m0.081s
user    0m0.060s
sys     0m0.020s
[root@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

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

第一种解决方法,就是将time命令和将要执行的命令行放到一个shell代码块中,也就是一对大括号中,要注意空格和分号的使用。
[root@web186 root]# {time find . -name "mysql.sh"} 2>2.txt

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

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

这次Bash认为命令都没有输入完成,少了分号。因为Bash认为后面的 } 是find命令的参数。
[root@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@web186 root]# cat 2.txt

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

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

另外一种方式就是使用子Shell的方式,如下所示:

[root@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@web186 root]# cat 2.txt

real    0m0.083s
user    0m0.040s
sys     0m0.020s
[root@web186 root]#

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

问题思考

1. 为什么执行find命令的多次时间统计差别很大,一次实际时间需要12秒,另外几次却不足1秒?

相关资料

【1】孵梦森林 Linux中的两个time

【2】Nine Rivers 重定向 Bash “time” 命令的输出

【3】seizeF的专栏 重定向Bash命令——time


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux time 和/usr/bin/time 的相关文章

随机推荐

  • hot编码 字符one_笔记1 one-hot、embedding

    one hot 在特征工程中需要对数据进行预处理 one hot在数据预处理中比较常见 1 什么是one hot One Hot编码 又称为一位有效编码 主要是采用N位状态寄存器来对N个状态进行编码 每个状态都由他独立的寄存器位 并且在任意
  • java 16进制字符串转16进制

    author j public class Test public static void main String args byte b HexString2Bytes AA020155 String s Bytes2HexString
  • IDA详细使用教程

    文章目录 软件介绍 目录结构 启动页面 IDA文件加载 界面介绍 常用快捷键 操作概述 函数操作 数据类型操作 导航操作 类型操作 关闭数据库 软件介绍 Ollydbg 仅仅是运行于 Windows 用户模式下的一种 32 位调试器 而 I
  • IDEA常用插件

    cajon plugin zip ChatGPT zip Generate All Getter And Setter zip github copilot intellij zip idea mybatis generator zip i
  • c++栈的用法(1)

    栈最大的特点是 先进后出 如同一筒羽毛球 先放进去的球是最后才能拿出来的 而后放进去的球却是最先拿出来的 同理 先储存进栈中的元素是最后才能展现 而后放进去的却是最先展现的 栈的头文件是 include
  • MySQL基础篇-第11章_数据处理之增删改

    第11章 数据处理之增删改 讲师 尚硅谷 宋红康 江湖人称 康师傅 官网 http www atguigu com 1 插入数据 1 1 实际问题 解决方式 使用 INSERT 语句向表中插入数据 1 2 方式1 VALUES的方式添加 使
  • 老司机教你如何跨进Python的大门

    1 Python介绍 python 动态语言 java 静态语言 python不用编译 直接解释执行 不用像java一样显式声明变量 要不要学看下图 2 安装Python 下载 解压缩 或者安装 配置环境变量 没错就是这么简单 查看pyth
  • 服务 zookeeper 不支持 chkconfig

    在给zk设置开机启动的时候 报错 服务 zookeeper 不支持 chkconfig 因为配置文件是从别人的博客了拷贝的 只是改了个性化的部分 然后就粘贴到服务器上了 服务器上使用service能正常执行start stop status
  • windows环境下springboot程序启停脚本

    1 启动应用脚本 echo off if 1 h goto begin mshta vbscript createobject wscript shell run nx0 h 0 window close exit begin start
  • css伪类where、is、has用法

    目录 一 where 1 作用 2 用法 3 优先级 二 is 1 作用 2 用法 3 优先级 三 has 1 作用 2 用法 3 优先级 css伪类where is has用法 一 where 1 作用 where CSS 伪类函数接受选
  • Windows查看和导入证书(.cer / .pfx)

    文章目录 证书介绍 问题汇总 导入导出细节注意 如何查看以上两种证书的到期日 Windows下导入证书 证书介绍 作为文件形式存在的证书一般有以下几种格式 带有私钥的证书 由Public Key Cryptography Standards
  • 深度学习-第T5周——运动鞋品牌识别

    深度学习 第T5周 运动鞋品牌识别 深度学习 第T5周 运动鞋品牌识别 一 前言 二 我的环境 三 前期工作 1 导入数据集 2 查看图片数目 3 查看数据 四 数据预处理 1 加载数据 1 设置图片格式 2 划分训练集 3 划分验证集 4
  • 如何选购阿里云服务器并快速入门(Windows版本)?

    本入门教程采用ecs g6 large实例规格 在Windows Server 2016系统上配置了IIS服务 结合ECS管理控制台展示如何快速使用云服务器ECS 准备工作 创建账号 以及完善账号信息 注册阿里云账号 并完成实名认证 具体操
  • Centos 7 Zabbix 6.0 TimescaleDB 安装配置

    Zabbix 6 0 TimescaleDB 安装配置 系统 Centos7 PHP PHP 7 4 30 apache httpd 2 4 6 PostgreSQL 13 TimescaleDB version 2 7 0 zabbix
  • C++学习(四三五)android获取so安装路径

    ClassLoader loader getClassLoader try Method library ClassLoader class getDeclaredMethod findLibrary String class String
  • 《深入理解计算机系统》实验八Proxy Lab 下载和官方文档机翻

    前言 深入理解计算机系统 官网 http csapp cs cmu edu 3e labs html 该篇文章是 实验八Proxy Lab的Writeup proxylab pdf 机翻 原文 http csapp cs cmu edu 3
  • python的面向对象和面向过程(意义和区别)

    面向过程 侧重于怎么做 1 把完成某一个需求的 所有步骤 从头到尾 逐步实现 2 根据开发要求 将某些功能独立的代码封装成一个又一个函数 3 最后完成的代码 就是顺序的调用不同的函数 特点 1 注重步骤和过程 不注重职责分工 2 如果需求复
  • 2020电赛经验总结+E题解题思路

    2020电赛经验总结 E题解题思路 取得的成果和经验 四川省2020年电子设计竞赛已经落下帷幕 第一次参加电赛 无论从知识还是经验上都有所获得 虽然只取得省三的成绩 但整个比赛过程为明年备战国赛具有指导作用 也算是一个不错的结果 一个团队中
  • 深度学习超分辨率重建(总结)

    本文为概述 详情翻看前面文章 1 SRCNN 2 3改进 开山之作 三个卷积层 输入图像是低分辨率图像经过双三次 bicubic 插值和高分辨率一个尺寸后输入CNN 图像块的提取和特征表示 特征非线性映射和最终的重建 使用均方误差 MSE
  • linux time 和/usr/bin/time

    http codingstandards iteye com blog 798788 用途说明 time命令常用于测量一个命令的运行时间 注意不是用来显示和修改系统时间的 这是date命令干的事情 但是今天我通过查看time命令的手册页 发