標準入力とコマンドライン引数のパフォーマンスの違い

標準入力とコマンドライン引数のパフォーマンスの違い

一部のコマンドでは、特定の入力をstdinまたはコマンドライン引数として指定できます。

具体的には、commandstdin入力とファイル名をコマンドライン引数として渡すことができ、command < myfile同じcat myfile | command 結果をcommand 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. リダイレクトは常にパイプより優れていますか?

ベストアンサー1

このcat file | command文法が考慮されます。役に立たない使用Cat。すべてのオプションのうち、カーネルに異なるプロセスを作成する必要があるため、パフォーマンスに影響を与えます。ただし、これは大きな計画ではマイナーに見えるかもしれませんが、他の形式にはないオーバーヘッドがあります。これにはすでに次の問題が含まれています。望ましくない猫に興味を持たなければなりませんか?

他の2つの形式の間にパフォーマンスの違いはほとんどありません。 STDINは、プロセスが他のファイルのように開いて読み取る必要がある特別なファイルノードです。 STDINの代わりにファイル名を渡すと、別のファイルが開きます。

違いは望ましい機能/柔軟性です。

  • プログラムにファイル名を渡すことは、入力ファイルを検索できることを意味します。これはプログラムにとって重要でも重要ではないかもしれませんが、ストリームを検索できる場合は、一部のジョブの速度が速くなる可能性があります。
  • 実際の入力ファイルを知ると、プログラムはそのファイルに書き込むことができます。たとえば、sed -i内部編集の場合です。 (注:バックグラウンドで新しいファイルを作成する必要があるため、他のリダイレクトと比較してパフォーマンスは向上しませんが、便利な手順です。)
  • シェルリダイレクトを使用すると、複数のファイルをリンクしたり、プロセスリダイレクトを使用したりすることもできます。sed [exp] < file1 file2でもsed [exp] < <(grep command)。このユースケースの詳細については、この問題を参照してください。プロセス置換とパイプ

おすすめ記事