すべてのパイプラインの問題は、本質的に作業が2倍になることです。解凍がどれほど高速であっても、データを別のプロセスにシャトルする必要があります。
Perlには、gzip圧縮されたストリームを直接読み取ることができる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秒対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
速度の点で、ここでの使用が勝者です。そして、その単純なコマンドラインは、プログラムの作成を確実に打ち負かしますが、どんなに短くてもです。