tail file | tr(パイプ)が複数行のsedまたはperlよりも速いのはなぜですか?

tail file | tr(パイプ)が複数行のsedまたはperlよりも速いのはなぜですか?

次のような約100万行のファイルがあります。

"ID" "1" "2"
"00000687" 0 1
"00000421" 1 0
"00000421" 1 0
"00000421" 1 0

最後の行は百万回以上繰り返された。 ~からインスピレーションを得るこの問題、提案された解決策のいくつかを試して、どちらが速いかを確認しました。 1つのプロセスしか使用しないソリューションは、パイプがあるソリューションよりも高速であると期待しています。しかし、これは私のテストの結果です。

  • tail -n +2 file.txt | tr -d \"

    $ time tail -n +2 file.txt | tr -d \" 1> /dev/null
    
    real    0m0,032s
    user    0m0,020s
    sys     0m0,028s
    
  • sed '1d;s/"//g' file.txt

    $ time sed '1d;s/"//g' file.txt 1> /dev/null
    
    real    0m0,410s
    user    0m0,399s
    sys     0m0,011s
    
  • perl -ne ' { s/"//g; print if $. > 1 }' file.txt

    $ time perl -ne ' { s/"//g; print if $. > 1 }' file.txt 1> /dev/null
    
    real    0m0,379s
    user    0m0,367s
    sys     0m0,013s
    

何度もテストを繰り返しましたが、いつも同様の数値が出ました。ご覧のとおり、tail -n +2 file.txt | tr -d \"はいはるかに早く他人より。なぜ?

ベストアンサー1

これは、実行されるタスクの量によって決まります。

あなたのtail | trコマンドは次のように終了します。

  • 存在するtail:
    • 改行まで読みます。
    • 改行の有無にかかわらず、残りの内容をすべて出力します。
  • in はtr読み、改行文字を気にせず、 '''(固定文字)を除くすべてを出力します。

sed与えられたスクリプトを解釈した後、コマンドは次のことを行います。

  • 改行まで読み、入力を累積します。
  • 最初の行の場合は削除してください。
  • 正規表現を解釈した後、すべての二重引用符を空白スペースに置き換えます。
  • 処理されたラインを出力します。
  • ファイルの最後まで繰り返します。

与えられたスクリプトを解釈した後、Perlコマンドは次のことを行います。

  • 改行まで読み、入力を累積します。
  • 正規表現を解釈した後、すべての二重引用符を空白スペースに置き換えます。
  • 最初の行でない場合は、処理された行を出力します。
  • ファイルの最後まで繰り返します。

大量の入力のため、改行文字を見つけるのに費用がかかります。

おすすめ記事