Top > Perl > Benchmark lock

ふと気になって、CGI の排他ロックなどでよく使われる flock(), mkdir(), symlink() の実行コストを比べてみた。結果は軽いほうから flock() < mkdir() < symlink() の順。

個人的には symlink() をよく利用していますが、flock() は予想通り速い。以下はテストコード。

#!/usr/bin/perl
 
use strict;
use Benchmark;
my $file  = 'f.dat';
my $lock  = 'f.lock';
my $count = shift || 1000;
my $loop  = shift || 1000;
 
open(F, ">$file") or die "Can not open $file: $!";
 
timethese($count, {
                   flock => sub {
                       for (my $i = 0; $i < $loop; $i++) {
                           flock(F, 2);
                           flock(F, 8);
                       }
                   },
                   mkdir => sub {
                       for (my $i = 0; $i < $loop; $i++) {
                           mkdir($lock, 0755);
                           rmdir($lock);
                       }
                   },
                   symlink => sub {
                       for (my $i = 0; $i < $loop; $i++) {
                           symlink(".", $lock);
                           unlink($lock);
                       }
                   },
                  });
 
close(F);
 
__END__

実行結果

Benchmark: timing 1000 iterations of flock, mkdir, symlink...
     flock:  3 wallclock secs ( 0.41 usr +  2.31 sys =  2.73 CPU)
     mkdir: 144 wallclock secs ( 0.95 usr + 142.73 sys = 143.68 CPU)
   symlink: 775 wallclock secs ( 1.51 usr + 125.84 sys = 127.34 CPU)
TrackBack(0)
TrackBack URL for this entry: http://www.asmate.net/mt/mt-tb.cgi/48
Comments (0)
コメントする









名前、アドレスを登録しますか?







Since 2003.6.19, Yutaka@smate.NET <yutaka@asmate.net>. Powered by MT 2.64