#!/usr/bin/perl use strict; use warnings; use Benchmark qw( cmpthese ); # this benchmark is a little naive, but glob is slower anyway my %Subs = ( tyeglob => sub { my $count = () = glob "*.pl*"; }, glob => sub { my $count = () = <*.pl*>; # scalar glob returns a file, d'oh }, readdir => sub { opendir(DIR,'.') or die $!; my $count = 0; while( $_ = readdir(DIR) ) { $count++ if /^.*?\.pl.*$/i; } closedir(DIR); }, readgrep => sub { opendir(DIR,'.') or die $!; my $count = scalar( grep {/^.*?\.pl.*/i} readdir(DIR)); closedir(DIR); }, ); cmpthese( -3, \%Subs ) unless @ARGV; if(@ARGV){ print "$_ ".$Subs{$_}->()."\n" for keys %Subs; } __END__ Benchmark: running glob, readdir, readgrep, tyeglob, each for at least 3 CPU seconds... glob: 3 wallclock secs ( 3.36 usr + 0.00 sys = 3.36 CPU) @ 407.14/s (n=1368) readdir: 4 wallclock secs ( 3.41 usr + 0.00 sys = 3.41 CPU) @ 889.44/s (n=3033) readgrep: 3 wallclock secs ( 3.30 usr + 0.00 sys = 3.30 CPU) @ 1058.48/s (n=3493) tyeglob: 3 wallclock secs ( 3.24 usr + 0.00 sys = 3.24 CPU) @ 403.40/s (n=1307) Rate tyeglob glob readdir readgrep tyeglob 403/s -- -1% -55% -62% glob 407/s 1% -- -54% -62% readdir 889/s 120% 118% -- -16% readgrep 1058/s 162% 160% 19% -- Benchmark: running glob, readdir, readgrep, tyeglob, each for at least 3 CPU seconds... glob: 4 wallclock secs ( 3.07 usr + 0.00 sys = 3.07 CPU) @ 403.91/s (n=1240) readdir: 4 wallclock secs ( 3.57 usr + 0.00 sys = 3.57 CPU) @ 849.58/s (n=3033) readgrep: 4 wallclock secs ( 3.41 usr + 0.00 sys = 3.41 CPU) @ 1024.34/s (n=3493) tyeglob: 4 wallclock secs ( 3.30 usr + 0.00 sys = 3.30 CPU) @ 396.97/s (n=1310) Rate tyeglob glob readdir readgrep tyeglob 397/s -- -2% -53% -61% glob 404/s 2% -- -52% -61% readdir 850/s 114% 110% -- -17% readgrep 1024/s 158% 154% 21% --