2

次を実行すると:

Measure-Command -Expression {gci -Path C:\ -Recurse -ea SilentlyContinue | where Extension -eq ".txt"}
Measure-Command -Expression {gci -Path C:\ -Filter *.txt -Recurse -ea SilentlyContinue}

2 番目の式は、パイプラインを使用する必要がないため、最初の式よりも常に高速です。

パイプライン メソッドで、PowerShell がドライブを再帰し、オブジェクトのコレクションを where 句に渡したのではないかと考えました。これは、アイテムをもう一度反復処理する必要があるためですが、最初の式を実行すると、それが返されることがわかるため、除外しました。再帰的に出力します。では、なぜ Pipeline メソッドが遅いのでしょうか?

4

2 に答える 2

5

使用Where-Objectは、左側のコマンドの組み込みパラメーターを使用するよりも常に遅くなります。最初にすべてのオブジェクトをシェルに持ち込んでから、それらのフィルタリングを開始します (クライアント側のフィルタリング)。

-Filter パラメーターに関しては、プロバイダー レベル (サーバー側のフィルター処理) で実行され、オブジェクトがアクセスされるとチェックされ、基準に一致するものだけが返されるため、高速に動作します。

于 2012-08-27T09:06:41.300 に答える
0

シェイの答えは完全に正しいです。ただし、2番目の質問に少し触れたいと思いました。パイプラインの内部で何が起こっているかを次に示します。

gci -Path C:\ -Recurse -ea SilentlyContinue | where Extension -eq ".txt"

gcic:\は、任意の拡張子以下のファイルとディレクトリの検索を開始します。それぞれが見つかると、その1 つの結果が に渡されWhere-Object、拡張子が でない場合は破棄され.txtます。拡張子が の場合.txt、そのオブジェクトはパイプラインで渡され、コンソール (または変数など) に渡されます。その後gci、検索を続行し、次のファイルが見つかると、それを渡します。したがって、c:\ドライブ全体を検索するのに数分かかる場合がありますが、パイプラインが動作するため、部分的な結果がすぐにストリーミングされて返されます。一度に 1 つのオブジェクト。

起こっていないgciのは、完全なディスク検索を一度に実行し、完了しWhere-Objectたときにのみ完全な結果セットを渡すことです。

于 2012-08-27T17:00:42.597 に答える