Проблема со всеми конвейерами в том, что вы по сути дела удваиваете работу. Независимо от того, насколько быстро выполняется декомпрессия, данные все равно необходимо перенести в другой процесс.
Perl имеет PerlIO :: gzip, который позволяет вам читать gzip-потоки напрямую. Следовательно, он может предложить преимущество, даже если его скорость распаковки может не соответствовать скорости 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]': $!";
Я попытался сделать это с помощью сжатого файла gzip 13 МБ (распаковывается до 1,4 ГБ) на старом MacBook Pro 2010 года с 16 ГБ оперативной памяти и старом ThinkPad T400 с 8 ГБ оперативной памяти, где файл уже находится в кеше. На Mac скрипт Perl был значительно быстрее, чем при использовании конвейеров (5 секунд против 22 секунд), но в ArchLinux он проиграл unpigz:
$ time -p ./gzlc.pl spy.gz
1154737
настоящий 4.49
пользователь 4.47
система 0,01
против
$ time -p unpigz -c spy.gz | туалет
1154737
реальный 3,68
пользователь 4.10
система 1,46
и
$ time -p zcat spy.gz | туалет
1154737
настоящий 6.41
пользователь 6.08
система 0,86
Понятно, что использование здесь unpigz -c file.gz | wc -l
является победителем в плане скорости. И эта простая командная строка наверняка превосходит написание программы, пусть даже короткой.