grep: short-circuit -v to bail out on first match
authorAri Sundholm <ari@tuxera.com>
Mon, 28 Jan 2019 17:41:12 +0000 (19:41 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Tue, 29 Jan 2019 13:53:22 +0000 (14:53 +0100)
A small optimization. There is no need to try matching the current
input line against any further patterns if a match was already
found and -v is specified.

function                                             old     new   delta
grep_file                                           1463    1440     -23

Signed-off-by: Ari Sundholm <ari@tuxera.com>
Signed-off-by: Niko Vähäsarja <niko@tuxera.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
findutils/grep.c

index 9d9da422c04758a8346c808ce37c554387f441d6..2cbe7ea919c35cf85ecf0719c67a11f5b8b7a1c2 100644 (file)
@@ -443,15 +443,23 @@ static int grep_file(FILE *file)
                                        }
                                }
                        }
-                       /* If it's non-inverted search, we can stop
-                        * at first match */
-                       if (found && !invert_search)
-                               goto do_found;
+                       /* If it's a non-inverted search, we can stop
+                        * at first match and report it.
+                        * If it's an inverted search, we can move on
+                        * to the next line of input, ignoring the
+                        * rest of the patterns.
+                        */
+                       if (found) {
+                               //if (invert_search)
+                               //      goto do_not_found;
+                               //goto do_found;
+                               break; // this accomplishes both
+                       }
                        pattern_ptr = pattern_ptr->link;
                } /* while (pattern_ptr) */
 
                if (found ^ invert_search) {
- do_found:
//do_found:
                        /* keep track of matches */
                        nmatches++;
 
@@ -552,6 +560,7 @@ static int grep_file(FILE *file)
                }
 #if ENABLE_FEATURE_GREP_CONTEXT
                else { /* no match */
+ //do_not_found:
                        /* if we need to print some context lines after the last match, do so */
                        if (print_n_lines_after) {
                                print_line(line, strlen(line), linenum, '-');