なぜこれですか?
sed -e '/\s.*$/ s///' -e '/\(.*\)/ s//\L\1/' > filename.txt
これより速いですか?
sed -e 's/\s.*$//' -e 's/\(.*\)/\L\1/' > filename.txt
私が実行してみるとほぼ同じことをしているように見えますが、他のものよりも速くする内部的に実際に変化するものは何ですか?
修正する: バージョン: (GNU sed) 4.4 入力データサイズ: 12GB
答え1
最初の呼び出しは、正規表現をアドレス範囲として使用して、選択した行セットにsed
置換コマンド()を適用することです。s
2番目の呼び出しは最初の呼び出しと同じ置換を適用しますが、アドレス範囲を使用せずに入力データのすべての行に適用されます。
225MiBの電子メールアーカイブでテストされました。
$ find . -type f -name "*.gz" -exec zcat {} + | time gsed -e '/\s.*$/ s///' -e '/\(.*\)/ s//\L\1/' >/dev/null
real 1m0,39s
user 0m49,69s
sys 0m10,53s
$ find . -type f -name "*.gz" -exec zcat {} + | time gsed -e 's/\s.*$//' -e 's/\(.*\)/\L\1/' >/dev/null
real 0m40,79s
user 0m34,02s
sys 0m7,85s
私はそれを何度も実行しました。提供される時間は代表的な時間です。
ご覧のとおり、取得します。反対あなたが得ると主張する結果。これはデータが原因である可能性があります。sed
同じデータでOpenBSDをテストしたとき(GNUのみなので少し変更された式を使用)、同様の結果が得られましたが、sed
時間差は小さくなります。