在shell中获取程序执行时间
- 2024-10-23 08:47:00
- admin 原创
- 95
问题描述:
我想要在几个不同的条件下在 Linux Shell 中执行某些操作,并能够输出每次执行的执行时间。
我知道我可以编写一个 perl 或 python 脚本来执行此操作,但是有没有办法可以在 shell 中执行此操作?(碰巧是 bash)
解决方案 1:
使用内置time
关键字:
$ 帮助时间
时间:时间[-p]管道
执行 PIPELINE 并打印实时、用户 CPU 时间的摘要,
以及执行 PIPELINE 终止时的系统 CPU 时间。
返回状态是 PIPELINE 的返回状态。‘-p’选项
以稍微不同的格式打印时间摘要。这使用
TIMEFORMAT 变量的值作为输出格式。
例子:
$ time sleep 2
实际 0分2.009秒
用户 0分0.000秒
系统 0分0.004秒
解决方案 2:
您可以获得比 bash 内置函数time
(即Robert Gamble 提到的time(1)/usr/bin/time
)更详细的信息。通常情况下,这是。
编者注:为确保调用的是外部实用程序 time
,而不是 shell 的time
关键字,请将其调用为/usr/bin/time
。time
是POSIX 授权的实用程序,但它需要支持的唯一选项是-p
。特定平台实现特定的非标准扩展:与GNU的实用程序-v
一起使用,如下所示(问题标记为time
Linux的);BSD/macOS 实现使用-l
来产生类似的输出 - 参见man 1 time
。
详细输出的示例:
$ /usr/bin/time -v sleep 1
Command being timed: "sleep 1"
User time (seconds): 0.00
System time (seconds): 0.00
Percent of CPU this job got: 1%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:01.05
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: 0
Minor (reclaiming a frame) page faults: 210
Voluntary context switches: 2
Involuntary context switches: 1
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
解决方案 3:
#!/bin/bash
START=$(date +%s)
# do something
# start your script work here
ls -R /etc > /tmp/x
rm -f /tmp/x
# your logic ends here
END=$(date +%s)
DIFF=$(( $END - $START ))
echo "It took $DIFF seconds"
解决方案 4:
对于逐行增量测量,请尝试gnomon。
$ npm install -g gnomon
$ <your command> | gnomon --medium=1.0 --high=4.0 --ignore-blank --real-time=100
命令行实用程序,有点像 moreutils 的 ts,用于将时间戳信息添加到另一个命令的标准输出中。对于需要记录耗时较长的进程的历史记录的长时间运行的进程非常有用。
您还可以使用--high
and/or--medium
选项指定长度阈值(以秒为单位),gnomon 将以红色或黄色突出显示时间戳。您还可以执行其他一些操作。
解决方案 5:
如果您想要更高的精度,请使用%N
with date
(并使用bc
diff,因为$(())
只处理整数)。
具体操作如下:
start=$(date +%s.%N)
# do some stuff here
dur=$(echo "$(date +%s.%N) - $start" | bc)
printf "Execution time: %.6f seconds" $dur
例子:
start=$(date +%s.%N); \n sleep 0.1s; \n dur=$(echo "$(date +%s.%N) - $start" | bc); \n printf "Execution time: %.6f seconds
" $dur
结果:
Execution time: 0.104623 seconds
解决方案 6:
如果您打算稍后使用这些时间进行计算,请学习如何使用选项-f
来/usr/bin/time
输出节省时间的代码。以下是我最近用来获取和排序全班学生程序执行时间的一些代码:
fmt="run { date = '$(date)', user = '$who', test = '$test', host = '$(hostname)', times = { user = %U, system = %S, elapsed = %e } }"
/usr/bin/time -f "$fmt" -o $timefile command args...
后来我把所有$timefile
文件连接起来,并将输出导入Lua 解释器。你可以用 Python 或 bash 或任何你喜欢的语法做同样的事情。我喜欢这种技术。
解决方案 7:
如果只需要精确到秒,那么可以使用内置$SECONDS
变量,它计算 shell 已运行的秒数。
while true; do
start=$SECONDS
some_long_running_command
duration=$(( SECONDS - start ))
echo "This run took $duration seconds"
if some_condition; then break; fi
done
解决方案 8:
您可以使用time
和subshell ()
:
time (
for (( i=1; i<10000; i++ )); do
echo 1 >/dev/null
done
)
或者在同一个 shell 中{}
:
time {
for (( i=1; i<10000; i++ )); do
echo 1 >/dev/null
done
}
解决方案 9:
方法是
$ > g++ -lpthread perform.c -o per
$ > time ./per
输出是>>
real 0m0.014s
user 0m0.010s
sys 0m0.002s
解决方案 10:
一种可能简单的方法(可能无法满足不同用户的需求)是使用 shell PROMPT。这是一种在某些情况下很有用的简单解决方案。您可以像以下示例一样使用 bash 提示功能:
导出 PS1='[ /u@h]$'
上述命令将导致 shell 提示符更改为:
[HH:MM:SS 用户名@主机名]$
每次运行命令(或按回车键)返回到 shell 提示符时,提示符都会显示当前时间。
注意:
1)请注意,如果您在输入下一个命令之前等待了一段时间,那么需要考虑这个时间,即 shell 提示符中显示的时间是显示 shell 提示符时的时间戳,而不是输入命令时的时间戳。有些用户选择在准备好下一个命令之前按 Enter 键来获取具有新时间戳的新提示符。2
)还有其他可用选项和修饰符可用于更改 bash 提示符,有关更多详细信息,请参阅(man bash)。
解决方案 11:
perf stat
Linux CLI 实用程序
这个工具对于节省时间来说有点大材小用。但它可以帮你做很多事情,帮助你分析和修复速度缓慢的问题,值得了解。Ubuntu 22.04 设置:
sudo apt install linux-tools-common linux-tools-generic
echo -1 | sudo tee /proc/sys/kernel/perf_event_paranoid
用法:
perf stat <mycmd>
示例运行如下stress-ng
:
perf stat stress-ng --cpu 1 --cpu-method matrixprod -t 5
示例输出:
Performance counter stats for 'stress-ng --cpu 1 --cpu-method matrixprod -t 5':
5,005.46 msec task-clock # 0.999 CPUs utilized
88 context-switches # 17.581 /sec
1 cpu-migrations # 0.200 /sec
1,188 page-faults # 237.341 /sec
18,847,667,167 cycles # 3.765 GHz
26,544,261,897 instructions # 1.41 insn per cycle
3,239,655,001 branches # 647.225 M/sec
25,393,369 branch-misses # 0.78% of all branches
5.012218939 seconds time elapsed
4.998051000 seconds user
0.009122000 seconds sys
perf
还可以做许多更高级的事情,例如这里我展示了如何使用它来分析代码:如何分析在 Linux 上运行的 C++ 代码?
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件