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