From: Gisle Aas Date: Wed, 5 Feb 1997 13:42:49 +0000 (+0100) Subject: Faster File::Compare X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=4d335c471cacb999603dc9b7dc6d3712051dbb6c;p=p5sagit%2Fp5-mst-13.2.git Faster File::Compare The following optimization speeds up File::Compare with 30% on my machine (in a test where most files in fact were different). One could perhaps also optimize the situation where the two files are the same thing. Is it portable to compare (stat)[0,1] for the two files and return 0 if these two numbers are equal? p5p-msgid: <199702051342.OAA02753@bergen.sn.no> --- diff --git a/lib/File/Compare.pm b/lib/File/Compare.pm index e76c10f..cef2423 100644 --- a/lib/File/Compare.pm +++ b/lib/File/Compare.pm @@ -27,7 +27,7 @@ sub compare { my $to = shift; my $closefrom=0; my $closeto=0; - my ($size, $status, $fr, $tr, $fbuf, $tbuf); + my ($size, $fromsize, $status, $fr, $tr, $fbuf, $tbuf); local(*FROM, *TO); local($\) = ''; @@ -42,6 +42,7 @@ sub compare { open(FROM,"<$from") or goto fail_open1; binmode FROM; $closefrom = 1; + $fromsize = -s FROM; } if (ref($to) && (isa($to,'GLOB') || isa($to,'IO::Handle'))) { @@ -54,11 +55,16 @@ sub compare { $closeto = 1; } + if ($closefrom && $closeto) { + # If both are opened files we know they differ if their size differ + goto fail_inner if $fromsize != -s TO; + } + if (@_) { $size = shift(@_) + 0; croak("Bad buffer size for compare: $size\n") unless ($size > 0); } else { - $size = -s FROM; + $size = $fromsize; $size = 1024 if ($size < 512); $size = $Too_Big if ($size > $Too_Big); }