stdinとコマンドライン引数のパフォーマンスの違い


11

一部のコマンドでは、特定の入力を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

コマンドがcat次の場合:

cat < myfile
cat myfile
  1. 彼らのパフォーマンスについていくつかの一般的なルールがあるかどうか疑問に思っていました。
  2. リダイレクトは常にパイプよりも優れていますか?

1
これらの(重複した)質問をするすべての人が、演習として自分のシェルを一から作成してほしいと思います。
アレックス、

1
「ありがとう」は使用しないでください。あなたの質問で。あなたの感謝の気持ちを表現するために答えを投票してください。
アレックス、

@アレックス:これがだまされている場合は、複製にリンクしてください。クローズします。通常、重複していることがわかっている質問には回答せず、モデレーターの注意を促すためにフラグを立てます。
カレブ

1
@alex:自分のシェルの書き方をどこで学べますか?
Tim

@Caleb:過去1か月に2回または3回のように尋ねられたと思いますが、便利なリンクはありません:-p
alex

回答:


6

cat file | command構文は考えられているの無駄な使用Cat。すべてのオプションの中で、カーネル内に別のプロセスを生成する必要があるため、パフォーマンスに影響します。取るに足らないことですが、全体像を把握できる場合もありますが、他のフォームにはないオーバーヘッドです。これは次のような質問でカバーされています:不要な猫を気にする必要がありますか?

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

違いは、探している機能や柔軟性にあります。

  • プログラムにファイル名を渡すことは、入力ファイルがシーク可能であることを意味します。これはプログラムにとって重要な場合と重要でない場合がありますが、ストリームがシーク可能である場合、一部の操作は高速化できます。
  • 実際の入力ファイルを知ることにより、プログラムは潜在的にそれに書き込むことができます。たとえばsed -i、インプレース編集。(注:これは舞台裏で新しいファイルを作成する必要があるため、他のリダイレクトよりもパフォーマンスが向上するわけではありませんが、便利な手順です。)
  • シェルリダイレクトを使用すると、複数のファイルを連結したり、プロセスリダイレクトを使用したりすることができます。sed [exp] < file1 file2またはsed [exp] < <(grep command)。この使用例の詳細は、この質問で見つけることができます:プロセスの置換とパイプ

プロセスの置換は、結果をパイプ処理することなく機能します。sed [exp] < <(grep command)と同じように正常に動作しますsed [exp] <(grep command)(シェルの支援なしでそれ自体で完全に開くことができる<(grep command)コマンドの長さの名前付き一時ファイルを作成するためsed)。
ShadowRanger

2
  1. それcommand fileがファイルを開くだけで、それ以降はそれがそうstdinであるかのように動作することを考えると、ほとんど違いはありません。シェルリダイレクトを使用すると、コマンドバイナリ自体ではなく、事前にファイルを開くだけです(シェルは行います)。

  2. cat file | commandvs について話している場合はcommand <file、後者が推奨されます。2つの間の大きなパフォーマンスの違いに気付くことはありませんが、前者は不必要に複雑です(パイプの追加プロセスと共有メモリバッファー、限られたスループット)。また、seek(ファイルポインターの位置を任意に変更)パイプ、通常のファイルでできます。seek入力ファイルで-ingが可能な場合、一部のコマンドはより効率的なアルゴリズムを使用する場合があります。


コマンドはある種の非順次アクセスを行う可能性があるため、コマンドファイルはコマンド<ファイルよりも優先されると思います。
user606723

そして、それでそれを止めるのは何<fileですか?あなたのポイントは、例えば、タフな導出出力ファイル名に入力ファイル名を使用するための有効です:gzip file生成しますfile.gz
アレックス2011

多分私はリダイレクトが内部でどのように機能するか理解していません。12GBの映画をmplayer / vlcにリダイレクトし、最後までスキップするとします。この場合、正確にはどうなりますか?
user606723

1
シェルはファイルを開き、ファイル記述子を継承するサブプロセスをフォークします。フォークプロセスclosestdinと通話dup開いたファイル記述子に、それは古いものを置き換えるように、stdinそのとの間に違いはありませんビューのムービープレーヤーの観点から(ほとんどの場合、TTYのいくつかの並べ替えであった。)で、それの名前でファイルを開きますプレーヤー自体。ファイル記述子はどちらのシナリオでもシークできるため、最後までスキップしても、ユーザーが検出できる違いはありません。
アレックス、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.