El problema con todas las tuberías es que esencialmente está duplicando el trabajo. No importa qué tan rápida sea la descompresión, los datos aún deben transferirse a otro proceso.
Perl tiene PerlIO :: gzip que le permite leer secuencias comprimidas directamente. Por lo tanto, podría ofrecer una ventaja incluso si su velocidad de descompresión puede no coincidir con la 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]': $!";
Lo probé con un archivo comprimido gzip de 13 MB (se descomprime a 1,4 GB) en un viejo MacBook Pro 2010 con 16 GB de RAM y un viejo ThinkPad T400 con 8 GB de RAM con el archivo ya en el caché. En la Mac, el script de Perl fue significativamente más rápido que el uso de tuberías (5 segundos frente a 22 segundos), pero en ArchLinux, perdió debido a la desconexión:
$ time -p ./gzlc.pl spy.gz
1154737
real 4.49
usuario 4.47
sys 0.01
versus
$ time -p unpigz -c spy.gz | wc -l
1154737
real 3.68
usuario 4.10
sys 1.46
y
$ time -p zcat spy.gz | wc -l
1154737
real 6.41
usuario 6.08
sys 0.86
Claramente, el uso unpigz -c file.gz | wc -l
es el ganador aquí tanto en términos de velocidad. Y, esa simple línea de comando seguramente es mejor que escribir un programa, por breve que sea.