Skip to content

Commit

Permalink
xdiff: give up scanning similar lines early
Browse files Browse the repository at this point in the history
In a corner case of large files whose lines do not match uniquely, the
loop to eliminate a line that matches multiple locations adjacent to a run
of lines that do not uniquely match wasted too much cycles.  Fix this by
giving up early after scanning 100 lines in both direction.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Davide Libenzi authored and Junio C Hamano committed Dec 3, 2008
1 parent 0fd9d7e commit 733070b
Showing 1 changed file with 13 additions and 2 deletions.
15 changes: 13 additions & 2 deletions xdiff/xprepare.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,9 @@
#include "xinclude.h"



#define XDL_KPDIS_RUN 4
#define XDL_MAX_EQLIMIT 1024

#define XDL_SIMSCAN_WINDOW 100


typedef struct s_xdlclass {
Expand Down Expand Up @@ -312,6 +311,18 @@ void xdl_free_env(xdfenv_t *xe) {
static int xdl_clean_mmatch(char const *dis, long i, long s, long e) {
long r, rdis0, rpdis0, rdis1, rpdis1;

/*
* Limits the window the is examined during the similar-lines
* scan. The loops below stops when dis[i - r] == 1 (line that
* has no match), but there are corner cases where the loop
* proceed all the way to the extremities by causing huge
* performance penalties in case of big files.
*/
if (i - s > XDL_SIMSCAN_WINDOW)
s = i - XDL_SIMSCAN_WINDOW;
if (e - i > XDL_SIMSCAN_WINDOW)
e = i + XDL_SIMSCAN_WINDOW;

/*
* Scans the lines before 'i' to find a run of lines that either
* have no match (dis[j] == 0) or have multiple matches (dis[j] > 1).
Expand Down

0 comments on commit 733070b

Please sign in to comment.