time 命令用于统计一个命令(或一个脚本)的执行时间,它的输出通常包含三行,分别对应三个关键的时间指标。

基本输出格式
当你对一个命令使用 time 时,它会执行该命令,并在命令执行完毕后,输出类似下面这样的三行信息:
$ time ls -l total 0 -rw-r--r-- 1 user user 0 Oct 26 10:30 test.txt drwxr-xr-x 3 user user 4096 Oct 26 10:30 test_dir real 0m0.045s user 0m0.001s sys 0m0.004s
在这个例子中,ls -l 是被测量的命令,下面三行就是 time 命令的输出。
三个核心时间指标详解
time 的输出核心是这三个时间:real、user 和 sys,理解它们的区别是使用 time 的关键。
real (实际时间 / 墙钟时间)
- 定义: 从命令开始执行到结束所经过的真实世界时间,它包括了命令执行期间所有等待的时间,比如等待 I/O 操作(读写文件、网络请求)、等待 CPU 调度等。
- 简单理解: 就像你用秒表测量的时间,从你按下开始到按下停止的总时间。
- 影响因素: CPU 速度、系统负载、I/O 速度、网络延迟等。
- 用途: 衡量一个任务的总耗时,是用户体验最直接相关的指标,如果一个程序
real时间很长,通常意味着它在等待某个资源。
user (用户态时间)
- 定义: CPU 在用户态(User Space)执行该命令所花费的时间,用户态是应用程序运行的空间,应用程序不能直接访问硬件,必须通过系统调用请求内核服务。
- 简单理解: CPU 为了执行你的程序代码(不包括系统调用)而花费的纯计算时间。
- 影响因素: 程序算法的效率、代码的优化程度。
- 用途: 衡量程序自身代码的计算开销,如果一个程序的
user时间远大于sys时间,说明它主要是计算密集型的。
sys (内核态时间 / 系统时间)
- 定义: CPU 在内核态(Kernel Space)执行该命令所花费的时间,当程序需要进行 I/O 操作、内存分配、创建进程等需要内核服务的操作时,会通过系统调用切换到内核态。
- 简单理解: CPU 为了执行你的程序所请求的操作系统内核任务(如读写文件、管理内存)而花费的时间。
- 影响因素: 程序与操作系统交互的频率,如文件读写、网络通信等。
- 用途: 衡量程序因依赖操作系统服务而产生的开销,如果一个程序的
sys时间很高,说明它主要是 I/O 密集型的。
一个生动的比喻
为了更好地理解这三者的关系,我们可以用一个“做三明治”的比喻:

- 你(厨师): 代表正在运行的程序。
- 厨房: 代表 CPU。
- 去超市买东西: 代表 I/O 操作(如读写文件、网络请求),这个过程你不在厨房里。
| 时间类型 | 比喻说明 |
|---|---|
real (实际时间) |
从你决定做三明治到吃掉它所花费的总时间,这包括了你在厨房切菜、烹饪的时间,也包括了你去超市买东西的路程和等待结账的时间。 |
user (用户态时间) |
你亲自动手在厨房里忙碌的时间,比如切面包、夹火腿、涂抹沙拉酱,这是你作为“用户”在做“用户”的事情。 |
sys (内核态时间) |
你为了完成三明治,而请求厨房(系统)提供的帮助所花费的时间,你打开烤箱预热(调用系统功能),或者你请求厨房帮你磨一把刀(请求内核资源)。 |
在这个比喻中:
- 如果你的三明治很简单,所有东西都在厨房里,
real时间约等于user时间。 - 如果你的三明治需要去很远的地方买特定的面包,
real时间会远大于user+sys时间,因为大部分时间都花在了路途(I/O 等待)上。 user+sys的和,代表了 CPU 实际为你的任务忙碌的总时间,这个和通常小于或等于real时间(因为 CPU 可能同时在处理其他任务,或者在等待 I/O)。
高级用法与格式化输出
默认的 time 输出格式可能不够灵活,在 Linux 系统中,通常有一个更强大的 time 命令,位于 /usr/bin/time(而 shell 内置的 time 通常功能较少),你可以使用 which time 来确认你正在使用的是哪个。
使用 -p 选项获得 POSIX 标准输出
这个选项会输出一个更简洁、标准的格式,只包含 real, user, sys。
$ /usr/bin/time -p ls -l real 0.00 user 0.00 sys 0.00
使用 -f 选项自定义输出格式
这是最强大的功能,你可以使用格式说明符来定制输出内容。

常用格式说明符:
| 格式说明符 | 描述 |
|---|---|
%e |
real 时间(秒),带小数 |
%U |
user 时间(秒),带小数 |
%S |
sys 时间(秒),带小数 |
%C |
被测量的命令名称 |
%P |
CPU 占用率((%U + %S) / %e) |
%M |
最大驻留集大小(KB),即程序占用的最大内存 |
%F |
页错误次数(次要) |
%R |
页错误次数(主要) |
示例:只输出 real 时间,并保留3位小数
$ /usr/bin/time -f "The command took %e seconds to complete." sleep 1.5 The command took 1.503 seconds to complete.
示例:显示命令名、CPU占用率和最大内存
$ /usr/bin/time -f "Command: %C\nCPU Usage: %P\nMax Memory: %M KB" tar -czf my_archive.tar.gz some_directory/ Command: tar -czf my_archive.tar.gz some_directory/ CPU Usage: 45% Max Memory: 3240 KB
在脚本中使用 time 并捕获输出
如果你想在脚本中自动记录命令的执行时间,可以将 time 的输出重定向到一个文件或变量中。
重定向到文件:
{
/usr/bin/time -f "Execution time: %e seconds" -o time.log my_script.sh
} # my_script.sh 的标准输出和标准错误不会被 time 捕获,需要额外处理
# 或者使用管道,但更复杂
(time -f "Execution time: %e seconds" my_script.sh) > script_output.log 2> time.log
将 user 时间捕获到变量中:
#!/bin/bash # 使用 process substitution 和 read 命令来捕获输出 /usr/bin/time -f "%U" -o /dev/stdout sleep 1 | read user_time echo "The user time was: $user_time seconds"
real: 真实世界总耗时,用户体验。user: CPU 花在程序自身代码上的时间。sys: CPU 花在为程序服务(内核调用)上的时间。user + sys: CPU 总忙碌时间。real >= user + sys: 通常成立,因为 CPU 可能有等待或被抢占。
通过分析这三个时间,你可以快速判断一个程序是计算密集型(user 高)还是I/O 密集型(sys 高 或 real 远大于 user+sys),从而进行针对性的优化。
