Skip to content

Commit 19e8117

Browse files
author
Neil Fraser
committed
Improve performance of line-mode speedup
Reserve 2/3rds of space for text1, 1/3rds for text2. Prevent overflow beyond hard limit.
1 parent 52afdf0 commit 19e8117

File tree

4 files changed

+9
-23
lines changed

4 files changed

+9
-23
lines changed

objectivec/DiffMatchPatch.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,6 @@ typedef enum {
157157
- (NSMutableArray *)diff_computeFromOldString:(NSString *)text1 andNewString:(NSString *)text2 checkLines:(BOOL)checklines deadline:(NSTimeInterval)deadline;
158158
- (NSMutableArray *)diff_lineModeFromOldString:(NSString *)text1 andNewString:(NSString *)text2 deadline:(NSTimeInterval)deadline;
159159
- (NSArray *)diff_linesToCharsForFirstString:(NSString *)text1 andSecondString:(NSString *)text1;
160-
- (NSString *)diff_linesToCharsMungeOfText:(NSString *)text lineArray:(NSMutableArray *)lineArray lineHash:(NSMutableDictionary *)lineHash;
161160
- (void)diff_chars:(NSArray *)diffs toLines:(NSMutableArray *)lineArray;
162161
- (NSMutableArray *)diff_bisectOfOldString:(NSString *)text1 andNewString:(NSString *)text2 deadline:(NSTimeInterval)deadline;
163162
- (NSMutableArray *)diff_bisectSplitOfOldString:(NSString *)text1 andNewString:(NSString *)text2 x:(NSUInteger)x y:(NSUInteger)y deadline:(NSTimeInterval)deadline;

objectivec/DiffMatchPatch.m

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -623,23 +623,6 @@ - (NSMutableArray *)diff_lineModeFromOldString:(NSString *)text1
623623
return diffs;
624624
}
625625

626-
/**
627-
* Split a text into a list of strings. Reduce the texts to a string of
628-
* hashes where each Unicode character represents one line.
629-
* @param text NSString to encode.
630-
* @param lineArray NSMutableArray of unique strings.
631-
* @param lineHash Map of strings to indices.
632-
* @return Encoded string.
633-
*/
634-
- (NSString *)diff_linesToCharsMungeOfText:(NSString *)text
635-
lineArray:(NSMutableArray *)lineArray
636-
lineHash:(NSMutableDictionary *)lineHash;
637-
{
638-
return [((NSString *)diff_linesToCharsMungeCFStringCreate((CFStringRef)text,
639-
(CFMutableArrayRef)lineArray,
640-
(CFMutableDictionaryRef)lineHash)) autorelease];
641-
}
642-
643626
/**
644627
* Find the 'middle snake' of a diff, split the problem in two
645628
* and return the recursively constructed diff.
@@ -859,12 +842,15 @@ - (NSArray *)diff_linesToCharsForFirstString:(NSString *)text1
859842
// So we'll insert a junk entry to avoid generating a nil character.
860843
[lineArray addObject:@""];
861844

845+
// Allocate 2/3rds of the space for text1, the rest for text2.
862846
NSString *chars1 = (NSString *)diff_linesToCharsMungeCFStringCreate((CFStringRef)text1,
863847
(CFMutableArrayRef)lineArray,
864-
(CFMutableDictionaryRef)lineHash);
848+
(CFMutableDictionaryRef)lineHash,
849+
40000);
865850
NSString *chars2 = (NSString *)diff_linesToCharsMungeCFStringCreate((CFStringRef)text2,
866851
(CFMutableArrayRef)lineArray,
867-
(CFMutableDictionaryRef)lineHash);
852+
(CFMutableDictionaryRef)lineHash,
853+
65535);
868854

869855
NSArray *result = [NSArray arrayWithObjects:chars1, chars2, lineArray, nil];
870856

objectivec/DiffMatchPatchCFUtilities.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -450,9 +450,10 @@ CFArrayRef diff_halfMatchICreate(CFStringRef longtext, CFStringRef shorttext, CF
450450
* @param text CFString to encode.
451451
* @param lineArray CFMutableArray of unique strings.
452452
* @param lineHash Map of strings to indices.
453+
* @param maxLines Maximum length for lineArray.
453454
* @return Encoded CFStringRef.
454455
*/
455-
CFStringRef diff_linesToCharsMungeCFStringCreate(CFStringRef text, CFMutableArrayRef lineArray, CFMutableDictionaryRef lineHash) {
456+
CFStringRef diff_linesToCharsMungeCFStringCreate(CFStringRef text, CFMutableArrayRef lineArray, CFMutableDictionaryRef lineHash, CFIndex maxLines) {
456457
#define lineStart lineStartRange.location
457458
#define lineEnd lineEndRange.location
458459

@@ -487,7 +488,7 @@ CFStringRef diff_linesToCharsMungeCFStringCreate(CFStringRef text, CFMutableArra
487488
const UniChar hashChar = (UniChar)hash;
488489
CFStringAppendCharacters(chars, &hashChar, 1);
489490
} else {
490-
if (CFArrayGetCount(lineArray) == 65535) {
491+
if (CFArrayGetCount(lineArray) == maxLength) {
491492
// Bail out at 65535 because char 65536 == char 0.
492493
line = diff_CFStringCreateJavaSubstring(text, lineStart, textLength);
493494
lineEnd = textLength;

objectivec/DiffMatchPatchCFUtilities.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ CFIndex diff_commonOverlap(CFStringRef text1, CFStringRef text2);
3131
CFArrayRef diff_halfMatchCreate(CFStringRef text1, CFStringRef text2, const float diffTimeout);
3232
CFArrayRef diff_halfMatchICreate(CFStringRef longtext, CFStringRef shorttext, CFIndex i);
3333

34-
CFStringRef diff_linesToCharsMungeCFStringCreate(CFStringRef text, CFMutableArrayRef lineArray, CFMutableDictionaryRef lineHash);
34+
CFStringRef diff_linesToCharsMungeCFStringCreate(CFStringRef text, CFMutableArrayRef lineArray, CFMutableDictionaryRef lineHash, CFIndex maxLines);
3535

3636
CFIndex diff_cleanupSemanticScore(CFStringRef one, CFStringRef two);
3737

0 commit comments

Comments
 (0)