哪一个对于浮点操作更有效,awk 或 bc



我正在用bash编写系统性能脚本。我想以百分比计算 CPU 使用率。我有两个实现,一个使用 awk,另一个使用 bc。我想知道两个版本中哪个更有效。使用 awk 或 bc 进行浮点数计算更好吗?谢谢!

版本 #1(使用 bc)

CPU=$(mpstat 1 1 | grep "Average" | awk '{print $11}')
CPU=$(echo "scale=2;(100-$CPU)" | bc -l)
echo $CPU

版本#2(使用awk)

CPU=$(mpstat 1 1 | grep "Average" | awk '{idle = $11} {print 100 - idle}')
echo $CPU

由于两者的处理时间都很小,因此生成最少进程和子壳的版本将"更高效"。

这是你的第二个例子。

但是您可以通过消除grep来使其更简单:

CPU=$(mpstat 1 1 | awk '/Average/{print 100 - $11}')

在版本 1 中,为什么需要第二行?为什么你不能从第一行本身做到这一点?我问是因为,第一个版本是 grep+awk+bc;第二个例子是grep+awk。所以我认为这种比较是无效的。

对于仅使用 bc,而不使用 awk,请尝试以下操作:

CPU=$(mpstat 1 1 | grep Average | { read -a P; echo 100 - ${P[10]}; } | bc )

感谢大家对我的awk/bc教育!
做了基准测试(希望以更正确的方式):
博士:AWK获胜

半长篇故事:
在我的系统上运行 3 次 1000 次 awk 平均值为 2.081333 秒,而 bc 平均为 3.460333 秒

完整故事:

[me@thebox tmp]$ time for i in `seq 1 1000` ; do echo "Average:     all    5.05    0.00    6.57    0.51    0.00    0.00    0.00    0.00   87.88" | awk '/Average/ {print 100 - $11}' >/dev/null ; done
real    0m1.922s
user    0m0.320s
sys     0m1.308s
[me@thebox tmp]$ time for i in `seq 1 1000` ; do echo "Average:     all    5.05    0.00    6.57    0.51    0.00    0.00    0.00    0.00   87.88" | awk '/Average/{print 100 - $11}' >/dev/null ; done
real    0m2.124s
user    0m0.370s
sys     0m1.368s
[me@thebox tmp]$ time for i in `seq 1 1000` ; do echo "Average:     all    5.05    0.00    6.57    0.51    0.00    0.00    0.00    0.00   87.88" | awk '/Average/{print 100 - $11}' >/dev/null ; done
real    0m2.198s
user    0m0.412s
sys     0m1.383s
[me@thebox tmp]$ time for i in `seq 1 1000` ; do echo "Average:     all    5.05    0.00    6.57    0.51    0.00    0.00    0.00    0.00   87.88" | grep Average | { read -a P; echo 100 - ${P[10]}; } | bc >/dev/null ; done
real    0m3.799s
user    0m0.691s
sys     0m3.059s
[me@thebox tmp]$ time for i in `seq 1 1000` ; do echo "Average:     all    5.05    0.00    6.57    0.51    0.00    0.00    0.00    0.00   87.88" | grep Average | { read -a P; echo 100 - ${P[10]}; } | bc >/dev/null ; done
real    0m3.545s
user    0m0.604s
sys     0m2.801s
[me@thebox tmp]$ time for i in `seq 1 1000` ; do echo "Average:     all    5.05    0.00    6.57    0.51    0.00    0.00    0.00    0.00   87.88" | grep Average | { read -a P; echo 100 - ${P[10]}; } | bc >/dev/null ; done
real    0m3.037s
user    0m0.602s
sys     0m2.626s
[me@thebox tmp]$

如果没有进一步的跟踪,我相信这与使用 bc 时分叉更多进程的开销有关。

我做了以下基准测试:

#!/bin/bash
count=0
tic="$(date +%s)"
while [ $count -lt 50 ]
do
mpstat 1 1 | awk '/Average/{print 100 - $11}'
count=$(($count+1))
done
toc="$(date +%s)"
sec="$(expr $toc - $tic)"
count=0
tic="$(date +%s)"
while [ $count -lt 50 ]
do
CPU=$(mpstat 1 1 | grep "Average" | awk '{print $11}')
echo "scale=2;(100-$CPU)" | bc -l
count=$(($count+1))
done
toc="$(date +%s)"
sec1="$(expr $toc - $tic)"
echo "Execution Time awk: "$sec
echo "Execution Time bc: "$sec1

两个执行时间相同...50秒。显然这没有任何区别。

相关内容

  • 没有找到相关文章

最新更新