本当に最初の行を取得して数百のファイルを読み取っている場合は、外部外部コマンドの代わりにシェルビルトインを検討してread
ください。これはbashとkshのシェルビルトインです。awk
これにより、、、などsed
を使用したプロセス作成のオーバーヘッドが排除されますhead
。
もう1つの問題は、I/Oのタイミングパフォーマンス分析を行うことです。初めてファイルを開いてから読み取るとき、ファイルデータはおそらくメモリにキャッシュされていません。ただし、同じファイルで2番目のコマンドを再試行すると、データとiノードがキャッシュされているため、使用するコマンドに関係なく、タイミングの結果が速くなる可能性があります。さらに、iノードは実質的に永久にキャッシュされたままになります。たとえば、Solarisで実行します。またはとにかく、数日。
たとえば、Linuxはすべてとキッチンシンクをキャッシュします。これは優れたパフォーマンス属性です。ただし、問題に気付いていない場合は、ベンチマークが問題になります。
このキャッシュ効果の「干渉」はすべて、OSとハードウェアの両方に依存します。
つまり、ファイルを1つ選び、コマンドで読み取ります。これでキャッシュされます。同じテストコマンドを数十回実行します。これは、I / Oハードウェアではなく、コマンドと子プロセスの作成の効果をサンプリングしています。
これは、ファイルを1回読み取った後、同じファイルの最初の行を取得する10回の反復でsedとreadが行われます。
sed: sed '1{p;q}' uopgenl20121216.lis
real 0m0.917s
user 0m0.258s
sys 0m0.492s
読む:read foo < uopgenl20121216.lis ; export foo; echo "$foo"
real 0m0.017s
user 0m0.000s
sys 0m0.015s
これは明らかに工夫されていますが、組み込みのパフォーマンスとコマンドの使用の違いを示しています。