Category Archives: 3-1.部分抽出

headよりtailが遅い?


アニメ『ウマ娘 プリティーダービー』

涙腺ゆるゆるなので、ちょっとした感動があるだけで、泣いてしまう私ですが、劇中のスペシャルウィークがデビュー戦で勝利した時にも、泣いてしまいました。いやあ実に面白い。馬娘たちのかけっこが、すごくスピード感あって、手に汗握ります。そして、レースだけでなく、勝利した馬娘は、ステージで歌と踊りを披露します。レースだけじゃ物足りない人も満足するだろうアニメです。

馬娘たちはみんな尻尾があるのですが、本当の馬は、尻尾で体にまとわりつく虫を叩き落としたりするらしいです。感情の落ち着かないと、やたら尻尾が動いたり。こんな蘊蓄を知ったのでアニメを見るときは、尻尾の動きにも注意しています(いつ虫を叩き落としてくれるか期待)。

さて今回は、tailコマンド。標準入力を受け取って処理する時、headだと先頭から処理されるので、処理時間を気にしなくても良いでしょうけど、tailの場合は、全部読み込んでからじゃないと末尾が分からないハズ。確認してみます。

headから。seqコマンドで大量の文字列を作って、headに渡します。

takk@deb9:~/tmp$ time seq 43214321 | head
1
2
3
4
5
6
7
8
9
10

real	0m0.002s
user	0m0.000s
sys	0m0.000s
takk@deb9:~/tmp$ 

一瞬で終わりました。

次は、tailコマンド。

takk@deb9:~/tmp$ time seq 43214321 | tail
43214312
43214313
43214314
43214315
43214316
43214317
43214318
43214319
43214320
43214321

real	0m0.853s
user	0m0.664s
sys	0m0.176s
takk@deb9:~/tmp$ 

大量と言いつつ今のコンピュータは性能が良いので、一瞬でした。
でも、headと比べたら、0.85msも遅いです。

当然tac等、間に挟んでも、処理時間が伸びるだけです。

takk@deb9:~/tmp$ time seq 43214321 | tac | head
43214321
43214320
43214319
43214318
43214317
43214316
43214315
43214314
43214313
43214312

real	0m1.733s
user	0m0.496s
sys	0m0.396s
takk@deb9:~/tmp$ 

次は、標準入力は使わずにファイルから読み込んでみます。標準入力が時間がかかる理由は、全行を読み込んでるから、と仮定すると、ファイルから読み込む場合は、時間がかからないハズです。
同じ文字列をファイルに保存します。

takk@deb9:~/tmp$ seq 43214321 >a.txt
takk@deb9:~/tmp$ ls -lh a.txt
-rw-r--r-- 1 takk takk 361M  6月  2 20:01 a.txt
takk@deb9:~/tmp$ 

361M Byteでした。

では、headで読み込み。 

takk@deb9:~/tmp$ time head a.txt
1
2
3
4
5
6
7
8
9
10

real	0m0.001s
user	0m0.000s
sys	0m0.000s
takk@deb9:~/tmp$ 

headの方は早くなってますね。

次は、tailです。

takk@deb9:~/tmp$ time tail a.txt
43214312
43214313
43214314
43214315
43214316
43214317
43214318
43214319
43214320
43214321

real	0m0.001s
user	0m0.000s
sys	0m0.000s
takk@deb9:~/tmp$ 

ほぼheadと変わらなくなりました。
ファイルから読み込み場合は、途中を読み込む必要がなく、ファイル末付近からアクセスすれば良いので、処理時間が早くなったんだろうと思います。