time 是Linux系统中用于测量命令执行时间的实用工具。它可以测量命令的执行时间(实际时间)、用户态CPU时间、内核态CPU时间,以及内存使用情况等。在Linux中有两种time命令:shell内置的time命令和独立的/usr/bin/time命令,后者通常提供更详细的信息。
time [选项] 命令 [命令参数]
/usr/bin/time命令有更丰富的选项。以下主要是/usr/bin/time的选项。
| 选项 | 说明 |
|---|---|
-p, --portability |
使用标准格式输出,单位秒 |
-f, --format 格式字符串 |
指定自定义输出格式 |
--append |
将输出追加到文件而不是覆盖 |
--verbose |
显示详细的资源使用信息 |
-o, --output 文件 |
将输出重定向到文件 |
-a, --append |
与-o一起使用,追加到文件而不是覆盖 |
-v, --version |
显示版本信息 |
-h, --help |
显示帮助信息 |
使用shell内置的time命令:
time ls -la
输出示例:
real 0m0.003s
user 0m0.001s
sys 0m0.002s
使用/usr/bin/time(通常提供更多信息):
/usr/bin/time ls -la
输出示例:
0.00user 0.00system 0:00.00elapsed 0%CPU (0avgtext+0avgdata 1616maxresident)k
0inputs+0outputs (0major+87minor)pagefaults 0swaps
/usr/bin/time -p sleep 2
-p选项使用标准格式输出,与内置time命令格式类似。
/usr/bin/time -f "执行时间: %E\n内存使用: %M KB" sleep 1
输出示例:
执行时间: 0:01.00
内存使用: 0 KB
/usr/bin/time -o time_output.txt sleep 3
执行时间信息将保存到time_output.txt文件中。
/usr/bin/time --verbose sleep 1
显示详细的资源使用统计信息。
time (for i in {1..1000}; do echo $i > /dev/null; done)
测量循环命令的执行时间。
| 指标 | 描述 | 含义 |
|---|---|---|
| real (实际时间) | 命令从开始到结束的实际流逝时间 | 墙上时钟时间,包括I/O等待、其他进程时间等 |
| user (用户态CPU时间) | 命令在用户态执行的时间 | CPU执行用户代码的时间 |
| sys (内核态CPU时间) | 命令在内核态执行的时间 | CPU执行系统调用的时间 |
| %CPU | CPU使用率百分比 | (user+sys)/real * 100% |
| 内存相关指标 | 最大驻留集大小、页错误等 | 命令的内存使用情况 |
%E:实际时间 [小时:]分钟:秒%e:实际时间(秒,浮点数)%U:用户态CPU时间(秒)%S:内核态CPU时间(秒)%P:CPU使用率百分比%x:命令退出状态%k:信号数量%M:最大驻留集大小(KB)%t:平均驻留集大小(KB)%K:平均总内存使用(KB)%D:平均非共享数据大小(KB)%p:平均非共享栈大小(KB)%X:平均共享文本大小(KB)%Z:系统页面大小(字节)%I:文件系统输入次数%O:文件系统输出次数%r:socket接收的消息数%s:socket发送的消息数%w:上下文切换次数(自愿)%c:上下文切换次数(非自愿)%C:命令名和参数%F:主要页错误数%R:次要页错误数%W:进程交换次数%%:百分号字符\n:换行符\t:制表符| 特性 | Shell内置time | /usr/bin/time |
|---|---|---|
| 可用性 | 所有shell都有内置版本 | 需要安装time包(通常默认安装) |
| 输出信息 | 简单的时间信息(real, user, sys) | 详细资源使用统计 |
| 格式控制 | 基本无格式控制 | 支持自定义格式字符串 |
| 输出重定向 | 输出到stderr,难以重定向 | 支持输出到文件 |
| 调用方式 | time command |
/usr/bin/time command |
比较不同算法的性能:
# 测量排序算法的性能
time sort -R /usr/share/dict/words > /dev/null
time sort /usr/share/dict/words > /dev/null
优化Shell脚本性能:
#!/bin/bash
# 测量脚本各部分的执行时间
time {
echo "开始处理..."
# 处理代码
sleep 1
echo "处理完成"
}
测量数据库查询性能:
# 测量SQL查询时间
time mysql -u root -e "SELECT * FROM users WHERE age > 30;"
测量网络命令执行时间:
# 测量网络下载时间
time wget https://example.com/large-file.zip
# 测量5次取平均值
for i in {1..5}; do
/usr/bin/time -p sleep 0.1 2>&1 | grep real | awk '{print $2}'
done | awk '{sum+=$1} END {print "平均值:", sum/NR}'
#!/bin/bash
# performance_test.sh
CMD=$1
TIMES=${2:-10}
echo "测试命令: $CMD"
echo "测试次数: $TIMES"
echo "========================="
total_real=0
total_user=0
total_sys=0
for ((i=1; i<=$TIMES; i++)); do
output=$(/usr/bin/time -p $CMD 2>&1 | tail -3)
real=$(echo "$output" | grep real | awk '{print $2}')
user=$(echo "$output" | grep user | awk '{print $2}')
sys=$(echo "$output" | grep sys | awk '{print $2}')
total_real=$(echo "$total_real + $real" | bc)
total_user=$(echo "$total_user + $user" | bc)
total_sys=$(echo "$total_sys + $sys" | bc)
echo "第$i次: real=$real, user=$user, sys=$sys"
done
echo "========================="
echo "平均值 - real: $(echo "scale=3; $total_real / $TIMES" | bc)s"
echo " user: $(echo "scale=3; $total_user / $TIMES" | bc)s"
echo " sys: $(echo "scale=3; $total_sys / $TIMES" | bc)s"
# 将时间测量结果输出为CSV格式
/usr/bin/time -f "%C,%E,%U,%S,%P,%M" -o results.csv sleep 1
cat results.csv
/usr/bin/time)type time 和 which timeenable timecommand timealias mytime='/usr/bin/time -f "时间: %E\n内存: %M KB"'man time 或 /usr/bin/time --helptime (command1 | command2 | command3)time command > /dev/null 2>&1sudo apt install time (Debian/Ubuntu)sudo apt install time安装/usr/bin/time2>&1重定向| 相关命令 | 说明 |
|---|---|
times |
显示shell及其子进程的累计用户和系统时间 |
date |
显示或设置系统日期和时间 |
perf |
Linux性能分析工具,提供更详细的性能数据 |
strace |
跟踪系统调用和信号,可用于性能分析 |
valgrind |
内存调试和性能分析工具 |
htop / top |
实时查看进程资源使用情况 |
ps |
报告进程状态,包括CPU和内存使用 |