我正在嘗試撰寫一個腳本,以便我可以運行我的程式 100 次并 grep 執行時間。目前我有這個:
#!/bin/bash
i=1
while [ $i -lt 100 ]
do
(time -p ./mdu -j $i /pkg) &>> tempfile.txt
echo $i
let i=$i 1
done
cat tempfile.txt | grep real > plot.txt
然而,這并沒有給我想要的輸出。我希望只獲得 100 次運行的執行時間,但 plot.txt 出現了 551 行資料。所有的行都包含“真正的 1.31(隨機時間)”,但感覺我得到了很多重復或其他東西。
我在這里做錯了什么?
uj5u.com熱心網友回復:
在撰寫它時,您將附加到tempfile.txt資源使用統計資料,以及程式的標準和錯誤輸出。因此,如果這最后兩個流包含real它們將污染您的結果。嘗試:
time (<your-program> &>> log.txt) &>> tempfile.txt
但是為什么不使用該time實用程式而不是 bash 內置函式及其選項 ( time -pao tempfile.txt) 來僅將統計資訊附加到您的檔案中呢?就像是:
#!/bin/bash
i=1
while [ $i -lt 100 ]
do
/usr/bin/time -pao tempfile.txt ./mdu -j $i /pkg &>> log.txt
echo $i
let i=$i 1
done
grep "real" tempfile.txt > plot.txt
此外,如果您使用該time實用程式,您甚至可以指定輸出格式,而不是使用-pPOSIX 格式并 grep 輸出。如果,對于您的情節,僅在 [小時:] 分鐘:秒中具有實時值更方便:
/usr/bin/time -f'%E' -ao tempfile.txt ...
如果你想在幾秒鐘內得到它:
/usr/bin/time -f'%e' -ao tempfile.txt ...
uj5u.com熱心網友回復:
您可能有 551 行資料,因為您一直在添加tempfile.txt并且從未洗掉其內容。
作為旁注,您的回圈運行 99 次,而不是 100 次。使用從零開始的編號或<=.
最后但并非最不重要的time是,它非常棘手(以其內置形式),特別是由于它與管道互動的方式。
run_n_times() {
local -ir N="$1"
shift
local -ar args=("$@")
local -i i
for ((i = 1; i <= N; i)); do
( time -p "${args[@]//#/"$i"}"; ) \
|& awk '/^real/ {print $2}'
done
}
# A simple test:
run_n_times 3 sleep '#'
# The real thing:
run_n_times 100 ./mdu -j '#' /pkg
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/323979.html
上一篇:將kubectl命令輸出保存在Bashscript中的變數中
下一篇:bash檢查新目錄并進行比較
