これを行う1つの方法は、パイプラインを徐々に構築し、各加算のタイミングを調整し、方程式から可能な限り多くを取り除くことです(端末やファイルへの出力など)。非常に簡単な例を以下に示します。
pax:~$ time ( cat bigfile >/dev/null )
real 0m4.364s
user 0m0.004s
sys 0m0.300s
pax:~$ time ( cat bigfile | tr 'a' 'b' >/dev/null )
real 0m0.446s
user 0m0.312s
sys 0m0.428s
pax:~$ time ( cat bigfile | tr 'a' 'b' | tail -1000l >/dev/null )
real 0m0.796s
user 0m0.516s
sys 0m0.688s
pax:~$ time ( cat bigfile | tr 'a' 'b' | tail -1000l | sort -u >/dev/null )
real 0m0.892s
user 0m0.556s
sys 0m0.756s
上記のユーザー時間とシステム時間を合計すると、増分の増加は次のようになります。
cat
;の場合は0.304(0.004 + 0.300)秒
tr
;の場合は0.436(0.312 + 0.428-0.304)秒
tail
;の場合は0.464(0.516 + 0.688-0.436-0.304)秒 と
- 0.108(0.556 + 0.756-0.464-0.436-0.304)秒
sort
。
これは、調べるべき主なものがとであることを私に教えてくれtail
ますtr
。
明らかに、これはCPU専用であり、平均化の目的で各ステージで複数の実行を実行する必要がありましたが、これが私が採用する基本的な最初のアプローチです。
それが本当にあなたのものであることが判明した場合、あなたgrep
が利用できる他のいくつかのオプションがあります。数字で始まらない行を削除できるコマンドは他にもたくさんありますが、これを行うためのカスタムビルドのコマンドは、(テストされていませんが、アイデアを得る必要があります)のような擬似コードの方が高速である場合があります。
state = echo
lastchar = newline
while not end of file:
read big chunk from file
for every char in chunk:
if lastchar is newline:
if state is echo and char is non-digit:
state = skip
else if state is skip and and char is digit:
state = echo
if state is echo:
output char
lastchar = char
このようなカスタムのターゲットコードは、特定のケースに最適化できるという理由だけで、汎用の正規表現処理エンジンよりも効率的になる場合があります。それが本当であるかどうかは、この場合、またはその問題のいずれかの場合であるかどうかは、テストする必要があります。私の一番の最適化のマントラは測定です、推測しないでください!