2014-10-27 64 views
0

我有一個腳本在一個星期內運行了幾百萬次,它只是簡單地找到一個名爲file.csv的CSV文件中的第一個單元格,它準確地匹配$word,並打印出整行,例如, CSV:如何確定在BASH中哪一行腳本選擇更快?

[email protected]@a machine that does automated work 
[email protected]@an animal that lives in the sea 
[email protected]@a plant that grows in the forest 

如果一個搜索 「樹」,那麼這將是印:

[email protected]@a plant that grows in the forest 

這兩種方法得到相同的結果:

awk [email protected] -v pattern="$word" '$1 ~ "^" pattern "$" {print; exit}' file.csv 

grep ^[email protected] file.csv | head -1 

同樣,這可能是用於檢查CSV第二列中的完全匹配,假設有3列:

awk [email protected] -v pattern="$word" '$2 ~ "^" pattern "$" {print; exit}' file.csv 

grep ^.*@[email protected]*@.*$ file.csv | head -1 

如果選擇了兩個腳本(例如上面的這個例子),它們總能產生完全相同的輸出結果,那麼我怎樣才能快速確定哪個腳本更快?

+1

這裏應該指出'grep -m 1'肯定會比'grep |在大多數情況下,頭-n 1'。 – tripleee 2014-10-27 11:05:52

+0

此外,第二個'grep'的更好的正則表達式應該是''^ [^ @] * @ $ word @「',它更好地匹配Awk表達式。 – tripleee 2014-10-27 11:08:36

回答

3

如果你真的關心效率,則精確匹配避免正則表達式,並使用這兩種commds爲:

awk -F'@' -v pattern="$word" '$1 == pattern{print; exit}' file.csv 

grep -m1 -F "[email protected]" file.csv 

做一些標杆使用time命令:

time awk -F'@' -v pattern="$word" '$1 == pattern{print; exit}' file.csv 

time grep -m1 -F "[email protected]" file.csv 
+2

'grep -m 1 -F「$ word @」file.csv'應該比通過'head'管道'grep'好。 – 2014-10-27 10:44:57

+0

非常感謝'-m 1'會比管道命令更好。 – anubhava 2014-10-27 10:46:29

+0

但僅限於第一個匹配不符合問題陳述,其中(根據我的理解)多行輸出是可能的,有時也是必需的。 – tripleee 2014-10-27 10:48:54

0

讓他們在循環中運行約1百萬次,並打印兩個腳本所需的時間(結束 - 開始)。一個會比另一個快。

4

您可以通過測量來確定哪個更快。 time命令是您的第一站。

你應該怎麼做?你如何定義「快速」?這顯然取決於,但如果你期望大多數單詞匹配,你可以花時間在文件中間的最後一行。假設您在CSV文件中有999行,並且第499行唯一地包含「gollum」;

time grep -m 1 '^[email protected]' file.csv >/dev/null 
time awk -F @ '$1 ~ "gollum" { print; exit }' file >/dev/null 

線長是否大致不一致?你主要期望搜索失敗?文件開頭附近的大部分匹配項?然後相應地調整您的實驗。

一個常見的警告是磁盤I/O緩存將使重新運行更快。爲了獲得可比較的結果,請始終先執行虛擬運行以確保爲實際運行填充高速緩存。可能幾次重新運行每個實驗,以便平均系統負載的臨時變化等。

您也可以推理您的問題。其他條件相同的情況下,我預計grep會更快,因爲它在啓動和處理每條輸入行時都不會進行解析。但是有時候,在某一方面或者其他方面的優化(或者是最後一個比較不好的表達方式,比如最後的grep),會導致這些常識性的結果。

+2

強制性參考:[分析Bash腳本](http://stackoverflow.com/questions/5014823/how-to-profile-a-bash -shell-script) - 不要只分析單行。 – sehe 2014-10-27 10:48:59