Fossil SCM

Performance improvement in LCS length computation used for side-by-side diff coloring.

drh 2016-09-28 19:48 trunk
Commit 08d970d68fb6d6c13f47436d659bd0c110d0f6ab
1 file changed +3 -3
+3 -3
--- src/diff.c
+++ src/diff.c
@@ -962,23 +962,23 @@
962962
if( nA>250 ) nA = 250;
963963
if( nB>250 ) nB = 250;
964964
avg = (nA+nB)/2;
965965
if( avg==0 ) return 0;
966966
if( nA==nB && memcmp(zA, zB, nA)==0 ) return 0;
967
- memset(aFirst, 0, sizeof(aFirst));
967
+ memset(aFirst, 0xff, sizeof(aFirst));
968968
zA--; zB--; /* Make both zA[] and zB[] 1-indexed */
969969
for(i=nB; i>0; i--){
970970
c = (unsigned char)zB[i];
971971
aNext[i] = aFirst[c];
972972
aFirst[c] = i;
973973
}
974974
best = 0;
975975
for(i=1; i<=nA-best; i++){
976976
c = (unsigned char)zA[i];
977
- for(j=aFirst[c]; j>0 && j<nB-best; j = aNext[j]){
977
+ for(j=aFirst[c]; j<nB-best && memcmp(&zA[i],&zB[j],best)==0; j = aNext[j]){
978978
int limit = minInt(nA-i, nB-j);
979
- for(k=1; k<=limit && zA[k+i]==zB[k+j]; k++){}
979
+ for(k=best; k<=limit && zA[k+i]==zB[k+j]; k++){}
980980
if( k>best ) best = k;
981981
}
982982
}
983983
score = (best>avg) ? 0 : (avg - best)*100/avg;
984984
985985
--- src/diff.c
+++ src/diff.c
@@ -962,23 +962,23 @@
962 if( nA>250 ) nA = 250;
963 if( nB>250 ) nB = 250;
964 avg = (nA+nB)/2;
965 if( avg==0 ) return 0;
966 if( nA==nB && memcmp(zA, zB, nA)==0 ) return 0;
967 memset(aFirst, 0, sizeof(aFirst));
968 zA--; zB--; /* Make both zA[] and zB[] 1-indexed */
969 for(i=nB; i>0; i--){
970 c = (unsigned char)zB[i];
971 aNext[i] = aFirst[c];
972 aFirst[c] = i;
973 }
974 best = 0;
975 for(i=1; i<=nA-best; i++){
976 c = (unsigned char)zA[i];
977 for(j=aFirst[c]; j>0 && j<nB-best; j = aNext[j]){
978 int limit = minInt(nA-i, nB-j);
979 for(k=1; k<=limit && zA[k+i]==zB[k+j]; k++){}
980 if( k>best ) best = k;
981 }
982 }
983 score = (best>avg) ? 0 : (avg - best)*100/avg;
984
985
--- src/diff.c
+++ src/diff.c
@@ -962,23 +962,23 @@
962 if( nA>250 ) nA = 250;
963 if( nB>250 ) nB = 250;
964 avg = (nA+nB)/2;
965 if( avg==0 ) return 0;
966 if( nA==nB && memcmp(zA, zB, nA)==0 ) return 0;
967 memset(aFirst, 0xff, sizeof(aFirst));
968 zA--; zB--; /* Make both zA[] and zB[] 1-indexed */
969 for(i=nB; i>0; i--){
970 c = (unsigned char)zB[i];
971 aNext[i] = aFirst[c];
972 aFirst[c] = i;
973 }
974 best = 0;
975 for(i=1; i<=nA-best; i++){
976 c = (unsigned char)zA[i];
977 for(j=aFirst[c]; j<nB-best && memcmp(&zA[i],&zB[j],best)==0; j = aNext[j]){
978 int limit = minInt(nA-i, nB-j);
979 for(k=best; k<=limit && zA[k+i]==zB[k+j]; k++){}
980 if( k>best ) best = k;
981 }
982 }
983 score = (best>avg) ? 0 : (avg - best)*100/avg;
984
985

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button