2012-11-24 130 views
1

我正在用bash編寫一個系統性能腳本。我想按百分比計算CPU使用率。我有兩個實現,一個使用awk,另一個使用bc。我想知道哪兩個版本更有效率。使用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 
+0

更「高效」?究竟是什麼意思? –

+0

在使用較少的CPU週期來執行計算方面效率更高。我正在尋找對系統造成較小壓力的方法。 – Lynx

+0

您是否嘗試過運行這1000次和計時? – mbatchkarov

回答

4

由於兩者的處理時間將是微小的,在該衍生爲至少版本進程和子殼的數量將會「更高效」。

這是你的第二個例子。

但是你可以把它甚至通過消除簡單的grep

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

太棒了!非常感謝你! – Lynx

2

在第1版,爲什麼還需要2號線?你爲什麼不能從第一行開始呢?我在問,因爲,第一個版本是grep + awk + ​​bc;第二個例子是grep + awk。所以我認爲比較是無效的。

對於僅使用BC,沒有AWK,試試這個:

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

不,你不能在純bash中完成它,因爲它涉及浮點運算。 –

+0

^^是的,我忘了。請參閱編輯。 – anishsane

+0

子外殼效率低下,無用。 –

-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秒。顯然它沒有任何區別。

+2

當然沒有區別,你在1秒內(在'mpstat'命令中)阻止了所有的事情50次。然後,做數學。 (提示:'50 * 1 = 50')。 –

0

感謝所有的教育我的awk/bc!
做標杆(以希望更多有道):
TL;博士:AWK勝

半長的故事:
3次1000運行awk的平均值來2.081333s我的系統上,而BC平均值來3.460333s

完整的故事:

[[email protected] 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 
[[email protected] 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 
[[email protected] 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 

[[email protected] 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 
[[email protected] 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 
[[email protected] 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 
[[email protected] tmp]$ 

沒有進一步追查我相信這是關係到使用BC時分叉多個進程的開銷。