jmo@foo:~> ls /some/small/dir|wc -l 322 jmo@foo:~> ls /some/large/dir|wc -l 12337 jmo@foo:~> perl ls.pl Benchmark: timing 5000 iterations of allready opendir on small dir, ls on small dir, opening dir on small dir... allready opendir on small dir: 3 wallclock secs ( 2.83 usr + 0.50 sys = 3.33 CPU) @ 1501.50/s (n=5000) ls on small dir: 30 wallclock secs ( 0.60 usr 2.48 sys + 11.90 cusr 16.85 csys = 31.83 CPU) @ 1623.38/s (n=5000) opening dir on small dir: 4 wallclock secs ( 3.31 usr + 0.61 sys = 3.92 CPU) @ 1275.51/s (n=5000) Benchmark: timing 5000 iterations of allready opendir on large dir, ls on large dir, opening dir on large dir... allready opendir on large dir: 102 wallclock secs (87.82 usr + 13.04 sys = 100.86 CPU) @ 49.57/s (n=5000) ls on large dir: 57 wallclock secs ( 0.51 usr 1.99 sys + 27.62 cusr 27.09 csys = 57.21 CPU) @ 2000.00/s (n=5000) opening dir on large dir: 101 wallclock secs (88.11 usr + 12.37 sys = 100.48 CPU) @ 49.76/s (n=5000) #### use Benchmark; use strict; my $dir = '/some/small/dir'; my $file = 'somefile*'; opendir (F, $dir); timethese(5000, {'ls on small dir' => \&foo, 'allready opendir on small dir' => \&bar, 'opening dir on small dir' => \&baz}); $dir = '/some/large/dir'; $file = 'somefile*'; print "\n\n\n"; closedir F; opendir (F, $dir); timethese(5000, {'ls on large dir' => \&foo, 'allready opendir on large dir' => \&bar, 'opening dir on large dir' => \&baz}); closedir F; sub foo { my $a = `ls $dir/$file &>/dev/null`; } sub bar { my (@files) = (grep (/$file/, readdir(F))); rewinddir (F); } sub baz { opendir (DIR, $dir); my (@files) = (grep (/$file/, readdir(DIR))); closedir F; }