Command-Line

標準輸入和命令行參數之間的性能差異

  • January 19, 2019

對於某些命令,可以將某些輸入指定為標準輸入或命令行參數。

具體來說,假設command可以將標準輸入和文件名作為命令行參數,並且command < myfile,cat myfile | commandcommand myfile可以產生相同的結果。

例如,

當命令是sed

sed s/day/night/ <myfile >new   
sed s/day/night/ myfile >new    
cat myfile | sed s/day/night/ >new

當命令是cat

cat < myfile
cat myfile
  1. 我想知道他們的表現是否有一些一般規則,即其中哪一個通常是最有效的,哪一個最不高效?
  2. 重定向總是比管道好嗎?

cat file | command語法被認為是無用的Cat。在所有選項中,它會影響性能,因為它必須在核心中生成另一個程序。然而,這在大局中可能會變得微不足道,這是其他形式所沒有的成本。這已涵蓋以下問題:我應該關心不必要的貓嗎?

其他兩種形式之間幾乎沒有性能差異。STDIN 是一個特殊的文件節點,程序必須像任何其他節點一樣打開和讀取它。傳遞文件名而不是 STDIN 只會使它打開一個不同的文件。

不同之處在於您正在尋找什麼功能/靈活性。

  • 將文件名傳遞給程序意味著輸入文件是可搜尋的。這對程序可能很重要,也可能無關緊要,但是如果流是可搜尋的,則可以加快某些操作。
  • 知道實際的輸入文件可以讓你的程序潛在地寫入它。例如sed -i就地編輯。(注意:由於這必須在幕後創建一個新文件,因此它不會比其他重定向帶來性能提升,但它是一個方便的步驟。)
  • 使用 shell 重定向使您能夠連接多個文件,甚至可以使用程序重定向。sed [exp] < file1 file2甚至sed [exp] < <(grep command)。這個案例的細節可以在這個問題上找到:程序替換和管道

引用自:https://unix.stackexchange.com/questions/17194