O problema com todos os pipelines é que você está basicamente dobrando o trabalho. Não importa a rapidez da descompressão, os dados ainda precisam ser transferidos para outro processo.
O Perl possui o PerlIO :: gzip, que permite ler diretamente os fluxos compactados em gzip. Portanto, ele pode oferecer uma vantagem, mesmo que sua velocidade de descompressão não corresponda à de unpigz
:
#!/usr/bin/env perl
use strict;
use warnings;
use autouse Carp => 'croak';
use PerlIO::gzip;
@ARGV or croak "Need filename\n";
open my $in, '<:gzip', $ARGV[0]
or croak "Failed to open '$ARGV[0]': $!";
1 while <$in>;
print "$.\n";
close $in or croak "Failed to close '$ARGV[0]': $!";
Eu tentei com um arquivo compactado em gzip de 13 MB (descompacta para 1,4 GB) em um antigo MacBook Pro 2010 com 16 GB de RAM e um ThinkPad T400 antigo com 8 GB de RAM com o arquivo já no cache. No Mac, o script Perl era significativamente mais rápido do que o uso de pipelines (5 segundos vs 22 segundos), mas no ArchLinux, ele perdia a desvantagem:
$ time -p ./gzlc.pl spy.gz
1154737
real 4,49
usuário 4.47
sys 0,01
versus
$ time -p unpigz -c spy.gz | wc -l
1154737
real 3,68
usuário 4.10
sys 1,46
e
$ time -p zcat spy.gz | wc -l
1154737
real 6,41
usuário 6.08
sys 0.86
Claramente, o uso unpigz -c file.gz | wc -l
é o vencedor aqui, tanto em termos de velocidade. E essa linha de comando simples certamente supera a escrita de um programa, por mais curto que seja.