Nenhum dos dois, use tail
ou head
:
$ time tail -n 4000001 foo | head -n 11
real 0m0.039s
user 0m0.032s
sys 0m0.004s
$ time head -n 4000010 foo | tail -n 11
real 0m0.055s
user 0m0.064s
sys 0m0.036s
tail
é de fato consistentemente mais rápido. Eu corri os dois comandos 100 vezes e calculei a média deles:
final:
real 0.03962
user 0.02956
sys 0.01456
cabeça:
real 0.06284
user 0.07356
sys 0.07244
Eu imagino que tail
é mais rápido porque apesar de ter que procurar todo o caminho até a linha 4e10, ele não imprime nada até chegar lá enquanto head
imprime tudo até a linha 4e10 + 10.
Compare com alguns outros métodos classificados por ordem de tempo:
sed:
$ time sed -n 4000000,4000011p;q foo
real 0m0.312s
user 0m0.236s
sys 0m0.072s
Perl:
$ time perl -ne 'next if $.<4000000; print; exit if $.>=4000010' foo
real 0m1.000s
user 0m0.936s
sys 0m0.064s
awk:
$ time awk '(NR>=4000000 && NR<=4000010){print} (NR==4000010){exit}' foo
real 0m0.955s
user 0m0.868s
sys 0m0.080s
Basicamente, a regra é quanto menos você analisar, mais rápido você é. Tratar a entrada como um fluxo de dados que só precisa ser impresso na tela (como tail
) será sempre o caminho mais rápido.