1

私はbashでシステムパフォーマンススクリプトを書いています。CPU使用率をパーセントで計算したいと思います。2つの実装があります。1つはawkを使用し、もう1つはbcを使用します。2つのバージョンのどちらがより効率的か知りたいです。フロートの計算には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
4

4 に答える 4

4

両方の処理時間が短くなるため、プロセスとサブシェルの生成が最も少ないバージョンは「より効率的」になります。

それが2番目の例です。

grepしかし、 :を削除することで、さらに簡単にすることができます。

CPU=$(mpstat 1 1 | awk '/Average/{print 100 - $11}')
于 2012-11-24T11:50:44.153 に答える
2

バージョン1では、なぜ2行目が必要なのですか?なぜ1行目からできないのですか?最初のバージョンはgrep+awk+bcであるためです。2番目の例はgrep+awkです。したがって、比較は有効ではないと思います。

awkなしでbcのみを使用する場合は、次のことを試してください。

CPU=$(mpstat 1 1 | grep Average | { read -a P; echo 100 - ${P[10]}; } | bc )
于 2012-11-24T12:09:31.880 に答える
0

awk / bcについて教えてくれてありがとう!
ベンチマークを実行しました(うまくいけばより適切な方法で):
tl; dr:awkが勝ちます

半長話:
私のシステムでは、1000回の実行の3倍の平均が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を使用するときにさらに多くのプロセスをフォークするオーバーヘッドに関連していると思います。

于 2016-08-02T08:12:04.680 に答える
-1

私は次のベンチマークを行いました:

#!/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秒。どうやらそれは何の違いもありません。

于 2012-11-24T12:39:17.283 に答える