2017-04-12 226 views
0

我運行以下命令:性能的WC -l

time for i in {1..100}; do find/-name "*.service" | wc -l; done 

得到了100線的結果,那麼:

真正0m35.466s 用戶0m15.688s SYS 0m14.552s

我然後跑以下命令:

time for i in {1..100}; do find/-name "*.service" | awk 'END{print NR}'; done 

得到了100線的結果,那麼:

真正0m35.036s 用戶0m15.848s SYS 0m14.056s

我準確的,我已經跑了find/-name "*.service"之前,因此被緩存兩個命令。我希望wc -l要更快。爲什麼不是?

+0

最初的'find'是緩存directs(inode),而不是內容。 –

+0

'find'的結果不會被緩存。 –

+0

@OliverCharlesworth,......好,它*略微* - dentry緩存至少意味着文件系統不需要返回到底層媒體。每次每次與文件系統交談時,它仍然是一個新的「find」實例。 –

回答

1

三件事:

  1. 這麼小的差異通常是不顯著:

    0m35.466s - 0m35.036s = 0m0.43s or 1.2% 
    
  2. 然而wc -lawk 'END{print NR}'更快(10倍)。

    % time seq 100000000 | awk 'END{print NR}' > /dev/null 
    
    real 0m13.624s 
    user 0m14.656s 
    sys 0m1.047s 
    % time seq 100000000 | wc -l > /dev/null 
    
    real 0m1.604s 
    user 0m2.413s 
    sys 0m0.623s 
    
  3. 我的猜測是,硬盤緩存保存的find結果,所以用wc -l後第一次運行,大部分的讀取需要find是在緩存中。推測初始find與磁盤讀取之間的時間差和具有高速緩存讀取的第二個find將大於awkwc之間的運行時間差。測試這個

    一種方法是重新啓動,它會清除硬盤的緩存,然後再次運行這兩個測試,但以相反的順序,使awk首先運行。我認爲第一輪awk會比第一輪wc更慢,而第二輪wc會比第二輪awk更快。其他

+0

幾乎和'awk'一樣慢'sed'。 '時間seq 100000000 | sed -n'$ ='>/dev/null'以* 12s *進入。 – agc

2

的已經提到,你可能會定時find,不wcawk。儘管如此,wcawk之間的各種口味之間可能還有一些有趣的差異。

這裏是我得到的結果:

Mac OS 10.10.5 awk 0.16m lines/second 
GNU awk/gawk 4.1.4 4.4m lines/second 
Mac OS 10.10.5 wc  6.8m lines/second 
GNU wc 8.27   11m lines/second 

我沒有使用find,但在替代wc -l或上一個大的文本文件'的awk「END {打印NR}」(66K線)循環。

我改變了命令的順序,並沒有發現任何偏差足以改變我報告的排名。

LC_CTYPE=C對這些中的任何一個都沒有可測量的影響。

結論

  1. 不使用MAC內建的命令行工具,除了瑣碎的數據。

  2. 在計數行GNU wc比GNU awk快。

我使用MacPorts GNU二進制文件。看看自制軟件的二進制代碼如何比較會很有趣。 (我猜他們會輸。)

相關問題