测量快速 bash 脚本的性能?

Tia*_*ago 2 performance bash

在编程语言中,我通常会通过循环几千次来测量相对较快(<1 秒完成)的性能,然后获得每次完成的平均时间。

我将如何在 bash 中做同样的事情来比较两个非常快速的命令的执行性能?

Rav*_*ina 5

最好使用类似time命令的东西。

Bash 也有一个time内置的,我建议使用time位于以下位置的二进制文件:/usr/bin/time

对于一个运行时:

command time -f "\nElapsed: %E \nUser: %U \nSystem: %S \nMemory: %M\n" \
./MyCommand 1> /dev/null
Run Code Online (Sandbox Code Playgroud)

哪些输出:

Elapsed: 0:00.01 
User: 0.00 
System: 0.00 
Memory: 2412
Run Code Online (Sandbox Code Playgroud)
  • 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
Run Code Online (Sandbox Code Playgroud)

这是输出:

2436.89 2524 2324
Run Code Online (Sandbox Code Playgroud)

你可以改变%K

  • %E: 经过实时
  • %I: 文件输入数
  • %P:此作业获得的 CPU 的百分比
  • %k: 传递给进程的信号数
  • %U: 用户模式下的CPU使用率
  • %S: 内核模式下的 CPU 使用率

man time

感谢 muru 写了一个更清晰的awk声明。

  • 此方法的一个问题是 /bin/time 仅对 CPU 使用厘秒分辨率,因此对于非常快的命令,CPU 将为零。例如,运行“sleep .1”使用的 CPU 向下舍入为 0.00,因此无论运行多少次迭代,CPU 总数始终为零。(内置的 bash 时间具有毫秒分辨率)。另外,“%E”打印的经过时间的格式为“[小时:]分钟:秒.xxx”(即 0:00.11),因此您不能使用简单的 awk“+”运算符对其进行求和。 (2认同)