Vấn đề với tất cả các đường ống là về cơ bản bạn đang nhân đôi công việc. Cho dù giải nén nhanh đến mức nào, dữ liệu vẫn cần được chuyển sang một quy trình khác.
Perl có PerlIO :: gzip cho phép bạn đọc các luồng được nén trực tiếp. Do đó, nó có thể mang lại lợi thế ngay cả khi tốc độ giải nén của nó có thể không khớp với 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]': $!";
Tôi đã thử nó với tệp nén gzip 13 MB (giải nén thành 1,4 GB) trên MacBook Pro 2010 cũ với RAM 16 GB và ThinkPad T400 cũ với RAM 8 GB với tệp đã có trong bộ đệm. Trên máy Mac, tập lệnh Perl nhanh hơn đáng kể so với sử dụng đường ống (5 giây so với 22 giây), nhưng trên ArchLinux, nó đã thua unpigz:
$ time -p ./gzlc.pl spy.gz
1154737
4,49 thật
người dùng 4,47
sys 0,01
đấu với
$ time -p unpigz -c spy.gz | wc -l
1154737
thực 3,68
người dùng 4.10
hệ thống 1.46
và
$ time -p zcat spy.gz | wc -l
1154737
6,41 thật
người dùng 6.08
hệ thống 0,86
Rõ ràng, sử dụng unpigz -c file.gz | wc -l
là người chiến thắng ở đây cả về tốc độ. Và, dòng lệnh đơn giản đó chắc chắn đánh bại việc viết một chương trình, tuy nhiên ngắn.