2015-06-28 74 views
4

我剛剛發現做find .比做find . | cat要慢。下面是我的主目錄做time find . 3次的結果:爲什麼管道貓比管道貓更快?

First: 
real 0m4.385s 
user 0m0.546s 
sys  0m2.072s 

Second: 
real 0m4.090s 
user 0m0.514s 
sys  0m1.798s 

Third: 
real 0m4.197s 
user 0m0.508s 
sys  0m1.905s 

time find . | cat代替顯著改善了結果:

First: 
real 0m2.988s 
user 0m0.378s 
sys  0m1.649s 

Second: 
real 0m2.768s 
user 0m0.370s 
sys  0m1.471s 

Third: 
real 0m2.768s 
user 0m0.370s 
sys  0m1.471s 

正如你所知道的,find . | cat快得多。我真的很困惑,cat唯一的做法是將其輸入複製到其輸出,對不對?我真的不知道爲什麼會發生這種情況,如果有人能告訴我爲什麼,我會很高興。

爲了記錄在案,這裏的find . | wc輸出:

246646 477986 25198490 

感謝。

+1

@LucasTrzesniewski:不。在bash中,'time'需要* pipeline *作爲參數,而不是signle命令。 – choroba

+0

@choroba我壞,不知道這是一個殼內置 –

+1

你怎麼真的在做時間測試?我想知道緩存是否可能與它有關。對我而言,無論我是否通過「貓」管道,我發現我第一次「發現」是最慢的。第二個咒語和後續(可能直到緩存未命中)更快 –

回答

3

find .的呼叫本身並不慢於find . | cat。當您將輸出打印到標準輸出時,它只會變慢。 當您將輸出重定向到/dev/null(具體來說,調用find . > /dev/nullfind . | cat > /dev/null)時,您應該注意到| cat比沒有更慢。

是我腦海從這些結果的唯一結論是,通過使貓運行打印一個單獨的進程中,find命令不被堵塞打印舉起stdout,而cat可以作爲獨立的過程,所以當它打印到stdout時,find命令仍在運行,實際上是在查找文件。