sed最適化の問題

sed最適化の問題

なぜこれですか?

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時間差は小さくなります。

おすすめ記事