Faster File::Compare
Gisle Aas [Wed, 5 Feb 1997 13:42:49 +0000 (14:42 +0100)]
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>

lib/File/Compare.pm

index e76c10f..cef2423 100644 (file)
@@ -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);
     }