Problem ze wszystkimi rurociągami polega na tym, że zasadniczo podwajasz pracę. Bez względu na to, jak szybka jest dekompresja, dane nadal muszą zostać przeniesione do innego procesu.
Perl ma PerlIO :: gzip, który pozwala bezpośrednio czytać strumienie gzip. Dlatego może oferować przewagę, nawet jeśli jego prędkość dekompresyjna może nie odpowiadać 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]': $!";
Próbowałem go z 13 MB skompresowanym plikiem gzip (dekompresuje się do 1,4 GB) na starym MacBooku Pro 2010 z 16 GB pamięci RAM i starym ThinkPad T400 z 8 GB pamięci RAM z plikiem już w pamięci podręcznej. Na Macu skrypt Perla był znacznie szybszy niż przy użyciu potoków (5 sekund vs 22 sekund), ale na ArchLinux stracił rozpakowanie:
$ time -p ./gzlc.pl spy.gz
1154737
prawdziwe 4,49
użytkownik 4.47
sys 0,01
przeciw
$ time -p unpigz -c spy.gz | wc -l
1154737
prawdziwy 3.68
użytkownik 4.10
sys 1.46
i
$ time -p zcat spy.gz | wc -l
1154737
prawdziwe 6,41
użytkownik 6.08
sys 0,86
Oczywiste jest, że używanie unpigz -c file.gz | wc -l
jest tutaj zwycięzcą zarówno pod względem szybkości. I ta prosta linia poleceń z pewnością przewyższa pisanie programu, nawet najkrótszego.