在编程语言中,我通常会通过循环几千次来测量相对较快的事物(<1秒完成)的性能,然后获得每次完成的平均时间。
我如何在 bash 中执行相同操作来比较两个非常快的命令的执行性能?
答案1
最好使用类似time
命令的东西。
Bash 也具有time
内置功能,我建议使用time
位于的二进制文件:/usr/bin/time
。
对于一个运行时:
command time -f "\nElapsed: %E \nUser: %U \nSystem: %S \nMemory: %M\n" \
./MyCommand 1> /dev/null
输出:
Elapsed: 0:00.01
User: 0.00
System: 0.00
Memory: 2412
command
:强制 bash 使用/usr/bin/time
而不是time
内置。
您可以使用time
循环来获取特定资源(例如内存)的“平均值”、“最小值”、“最大值”:
该代码将运行./COMMAND
命令 1000 次,然后打印出其总(数据+堆栈+文本)内存使用量的“最小值、最大值、平均值”。
#!/bin/bash
tmpfile=`mktemp`
for i in {1..1000}; do command time -ao $tmpfile -f "%K" ./COMMAND 1>/dev/null; done;
awk 'NR == 1 {min = $0} $0 > max {max = $0} {total += $0} END {print total/NR, min, max}' $tmpfile
rm $tmpfile
输出如下:
2436.89 2524 2324
您可以%K
使用以下方式进行更改:
%E
:实际经过的时间%I
:文件输入数量%P
:此作业获得的 CPU 百分比%k
:传递给进程的信号数量%U
:用户模式下的CPU使用率%S
:内核模式下的 CPU 使用率
看man time
感谢muru写了更清晰的awk
声明。
答案2
您可以使用Python 的timeit
模块(通常用于 Python 代码片段),使用subprocess.call
运行外部命令的函数:
$ python3 -m timeit -s 'import subprocess' 'subprocess.call(["sleep", "0.1"])'
10 loops, best of 3: 103 msec per loop
您可以使用以下方式更改循环次数-n
:
$ python3 -m timeit -n 5 -s 'import subprocess' 'subprocess.call(["sleep", "0.1"])'
5 loops, best of 3: 103 msec per loop
由于sleep 0.1
应该休眠 100 毫秒,因此测量结果看起来相当准确。
另请参阅:
答案3
没关系,明白了:
N=10000
time(for i in $(eval echo "{1..$N}"); do
./mycommand &>/dev/null
done)