标准输入和命令行参数之间的性能差异

Tim*_*Tim 11 command-line pipe io-redirection cat

对于某些命令,可以将某些输入指定为 stdin 或命令行参数。

具体而言,假设command可以采取stdin的输入和一个文件名作为命令行参数,并且command < myfilecat myfile | commandcommand myfile可以产生相同的结果。

例如,

当命令是sed

sed s/day/night/ <myfile >new   
sed s/day/night/ myfile >new    
cat myfile | sed s/day/night/ >new
Run Code Online (Sandbox Code Playgroud)

当命令是cat

cat < myfile
cat myfile
Run Code Online (Sandbox Code Playgroud)
  1. 我想知道他们的表现是否有一些一般规则,即其中哪一个通常最有效,哪一个最不有效?
  2. 重定向总是比管道更好吗?

Cal*_*leb 6

cat file | command语法被认为是 的无用使用Cat。在所有选项中,它会降低性能,因为它必须在内核中生成另一个进程。无论这在大局中可能是多么微不足道,它都是其他形式所没有的开销。这已经涵盖在以下问题中:我应该关心不必要的猫吗?

在其他两种形式之间,几乎没有性能差异。STDIN 是一个特殊的文件节点,进程必须像任何其他节点一样打开和读取它。传递文件名而不是 STDIN 只会让它打开一个不同的文件。

不同之处在于您正在寻找哪些功能/灵活性。

  • 将文件名传递给程序意味着输入文件是可查找的。这对程序可能重要也可能无关紧要,但如果流是可查找的,则可以加快某些操作。
  • 知道实际的输入文件允许您的程序潜在地写入它。例如sed -i就地编辑。(注意:因为这必须在幕后创建一个新文件,所以它不会比其他重定向提高性能,但这是一个方便的步骤。)
  • 使用 shell 重定向使您能够连接多个文件,甚至使用进程重定向。sed [exp] < file1 file2甚至sed [exp] < <(grep command)。这个用例的详细信息可以在这个问题上找到:进程替换和管道