所有管道的问题在于,您实际上要加倍工作。无论解压缩有多快,数据仍然需要传递到另一个进程。
Perl具有PerlIO :: 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]': $!";
我在具有16 GB RAM的旧2010 MacBook Pro和具有8 GB RAM的旧ThinkPad T400上使用了13 MB gzip压缩文件(解压缩为1.4 GB)进行了尝试,该文件已在缓存中。在Mac上,Perl脚本比使用管道要快得多(5秒vs 22秒),但是在ArchLinux上,它输给了unpigz:
$ time -p ./gzlc.pl spy.gz
1154737
真正的4.49
用户4.47
sys 0.01
与
$ time -p unpigz -c spy.gz | wc -l
1154737
真实的3.68
用户4.10
sys 1.46
和
$ time -p zcat spy.gz | wc -l
1154737
真正的6.41
用户6.08
sys 0.86
显然,unpigz -c file.gz | wc -l
无论是速度还是速度,赢家都是赢家。而且,无论多么简短,该简单的命令行肯定比编写程序要好。