测量快速 Bash 脚本的性能?

测量快速 Bash 脚本的性能?

在编程语言中,我通常会通过循环几千次来测量相对较快的事物(<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)

答案4

我正在寻找一些东西,并遇到了这个问题和:

https://github.com/sharkdp/hyperfine- “命令行基准测试工具”

年龄变化率

相关内容