2015-02-08 70 views
-2

我有一個簡單的C程序,可以根據輸入的文件來分析所需的時間。它將句子中花費的時間打印到標準輸出。有沒有辦法讓bash腳本多次使用特定的輸入來運行這個程序,並從每次迭代(從stdout)中抽出時間運行,這樣我就可以在所有迭代中平均時間?我想製作一個簡單的bash腳本,它可以運行我的可執行文件100多次

所以我將運行原來的C程序,像這樣:

./test文件1文件2 out.out

並運行後,它會打印 「經過時間爲XX.XX秒」到stdout 。

特別是,我將如何編寫一個在相同的輸入文件上運行100次測試的shell腳本,並將所有運行的運行時間平均化?

謝謝,抱歉沒有澄清

回答

1

像這樣也許:

#!/bin/bash 
start=$SECONDS 
for i in {0..99}; do 
    ./program file1 file2 
done 
end=$SECONDS 
echo "scale=2;($end-$start)/100"|bc 

我只是用$SECONDS(其中bash計數爲你反正)找到,而不需要經過的總時間運行awk。然後在最後,我讓bc以秒爲單位計算浮點平均時間到小數點後兩位(scale=2)。

+0

謝謝你,但是我做了修改,以我原來的職位,只是想知道如果這可能會影響你的答案。 所以像test.sh這樣的簡單腳本,對於我在{0..99}中的「test.sh file1 file2 out.out」 運行;做 ./test $ 1 $ 2 $ 3 但是,我將如何平均所有迭代的時間? – 2015-02-08 20:17:20

+0

我簡化了它 - 請再看一下。 – 2015-02-08 21:18:27

+0

謝謝,這正是我需要的! – 2015-02-09 05:51:45

0

嘗試

for i in {0..99}; 
    /usr/bin/time test file1 file2 out.out 2>&1 >/dev/null | awk ' 
     {split($3, ct, "[:a-zA-Z]"); summ += ct[1]; sums += ct[2]} 
    END {print summ/100.0, sums/100.0} 
    ' 
done 

重定向的順序是非常重要的;當stdout變爲null時,您希望將stderr(time命令的輸出)傳送到awk。如果你沒有任何標準輸出,你可以刪除>/dev/null。你不能使用內置的bash time,因爲它會計時整個管道。

您可以處理分秒款項,只要你想,要麼得到一個總時間,平均時間等

+0

謝謝!但是,當我嘗試了這一點,我得到了一些語法錯誤,我會盡力找到我的方式。雖然謝謝! – 2015-02-08 20:37:46

+0

使用@ MarkSetchell的答案獲取總時間,然後通過awk重定向整個輸出。或者,通過僅處理具有/ elapsed /的行來使awk腳本更復雜一點, – mpez0 2015-02-08 20:44:42

相關問題