在Bash中为命令执行计时:应选择time关键字、/usr/bin/time命令还是times内置命令?
在Bash中为命令执行计时:应选择time关键字、/usr/bin/time命令还是times内置命令?
刚入门Bash,想要测试不同写法的代码效率,肯定会碰到计时工具的选择问题吧?我最近也在折腾这个,刚好做了些实际测试,来跟你唠唠time(还有它的两个版本)和times的区别,帮你选到合适的工具。
先搞清楚这几个工具的身份,用type -a和which就能查明白:
$ type -a time time is a shell keyword time is /usr/bin/time time is /bin/time $ type -a times times is a shell builtin $ which -a time /usr/bin/time /bin/time
简单说:
time有俩版本:一个是Bash自带的关键字(直接敲time默认用这个),另一个是独立的外部命令(/usr/bin/time和/bin/time是同一个文件的不同链接);times是Bash的内置命令,只能在Bash里用。
接下来结合我测试的例子具体说,先整个简单的测试脚本:
echo "echo a script" > script
1. Bash内置time关键字:快速看基础耗时
直接敲time 命令用的就是这个版本,输出简洁直观,适合快速了解命令的基本耗时:
$ time bash ./script a script real 0m0.009s user 0m0.006s sys 0m0.002s
这里的三个时间分别是:
real:从命令启动到结束的实际墙钟时间(包括等待IO、系统调度其他进程的时间);user:命令在用户空间运行消耗的CPU时间;sys:命令在内核空间执行系统调用消耗的CPU时间。
日常快速测命令快慢,用这个就足够了。
2. 外部/usr/bin/time命令:看详细资源消耗
如果需要深入分析命令的资源使用情况,就得用这个外部命令(必须写全路径,或者用command time来避开内置关键字):
$ /usr/bin/time bash ./script a script 0.00user 0.00system 0:00.00elapsed 80%CPU (0avgtext+0avgdata 3328maxresident)k 0inputs+0outputs (0major+148minor)pagefaults 0swaps
它的输出除了基础的CPU时间,还包含了CPU使用率、内存峰值、IO操作次数、页错误数量、交换分区使用情况这些细节,排查性能瓶颈的时候特别有用。
3. times内置命令:统计shell会话累计时间
这个工具跟前面俩不一样,它不是用来单独给某个命令计时的,而是显示当前shell会话中所有进程的累计CPU时间:
$ times bash ./script 0m0.082s 0m0.074s 0m0.019s 0m0.041s
输出的两行分别是:
- 第一行:当前shell进程及其所有子进程的累计user/sys CPU时间;
- 第二行:当前shell中后台进程的累计user/sys CPU时间。
所以如果你直接用times 命令,它会先执行命令,然后输出整个shell会话到目前为止的累计时间,不是这个命令单独的耗时。如果想用它单独测命令,得先记录初始时间,执行命令后再对比,步骤比较繁琐,一般不用来测单个命令。
总结怎么选
- 快速查看单个命令的基础耗时:用Bash内置的
time关键字(直接time 命令); - 需要详细的资源消耗统计:用
/usr/bin/time(写全路径或command time); - 查看当前shell会话所有进程的累计CPU时间:用
times内置命令。
备注:内容来源于stack exchange,提问作者dmkonlinux
相关产品推荐
相关产品推荐

