Skip to content

Commit ded6142

Browse files
committed
Use a slice instead of a linked list to track equalities
This is easier to follow and more idiomatic. It also offers a minor overall performance boost. name old time/op new time/op delta DiffHalfMatch-8 107µs ± 1% 108µs ± 0% +0.91% (p=0.000 n=9+9) DiffCleanupSemantic-8 968µs ± 1% 921µs ± 1% -4.87% (p=0.000 n=9+10) DiffMain-8 1.01s ± 0% 1.01s ± 0% ~ (p=0.353 n=10+10) DiffMainLarge-8 102ms ± 2% 101ms ± 1% ~ (p=0.842 n=10+9) DiffMainRunesLargeLines-8 515µs ± 1% 515µs ± 1% ~ (p=0.400 n=9+10) name old alloc/op new alloc/op delta DiffHalfMatch-8 106kB ± 0% 106kB ± 0% ~ (all equal) DiffCleanupSemantic-8 177kB ± 0% 163kB ± 0% -7.81% (p=0.000 n=10+10) DiffMain-8 16.4MB ± 0% 16.4MB ± 0% +0.00% (p=0.000 n=9+10) DiffMainLarge-8 4.81MB ± 0% 4.81MB ± 0% ~ (p=1.000 n=10+10) DiffMainRunesLargeLines-8 174kB ± 0% 174kB ± 0% ~ (p=0.810 n=10+10) name old allocs/op new allocs/op delta DiffHalfMatch-8 2.00 ± 0% 2.00 ± 0% ~ (all equal) DiffCleanupSemantic-8 3.12k ± 0% 1.11k ± 0% -64.48% (p=0.000 n=10+10) DiffMain-8 83.0 ± 0% 84.0 ± 0% +1.20% (p=0.000 n=9+10) DiffMainLarge-8 46.3k ± 0% 46.3k ± 0% -0.08% (p=0.000 n=10+10) DiffMainRunesLargeLines-8 1.08k ± 0% 1.08k ± 0% ~ (all equal)
1 parent 639b52b commit ded6142

File tree

1 file changed

+9
-18
lines changed

1 file changed

+9
-18
lines changed

diffmatchpatch/diff.go

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -645,11 +645,7 @@ func (dmp *DiffMatchPatch) diffHalfMatchI(l, s []rune, i int) [][]rune {
645645
func (dmp *DiffMatchPatch) DiffCleanupSemantic(diffs []Diff) []Diff {
646646
changes := false
647647
// Stack of indices where equalities are found.
648-
type equality struct {
649-
data int
650-
next *equality
651-
}
652-
var equalities *equality
648+
equalities := make([]int, 0, len(diffs))
653649

654650
var lastequality string
655651
// Always equal to diffs[equalities[equalitiesLength - 1]][1]
@@ -662,11 +658,7 @@ func (dmp *DiffMatchPatch) DiffCleanupSemantic(diffs []Diff) []Diff {
662658
for pointer < len(diffs) {
663659
if diffs[pointer].Type == DiffEqual {
664660
// Equality found.
665-
666-
equalities = &equality{
667-
data: pointer,
668-
next: equalities,
669-
}
661+
equalities = append(equalities, pointer)
670662
lengthInsertions1 = lengthInsertions2
671663
lengthDeletions1 = lengthDeletions2
672664
lengthInsertions2 = 0
@@ -687,21 +679,20 @@ func (dmp *DiffMatchPatch) DiffCleanupSemantic(diffs []Diff) []Diff {
687679
(len(lastequality) <= difference1) &&
688680
(len(lastequality) <= difference2) {
689681
// Duplicate record.
690-
insPoint := equalities.data
682+
insPoint := equalities[len(equalities)-1]
691683
diffs = splice(diffs, insPoint, 0, Diff{DiffDelete, lastequality})
692684

693685
// Change second copy to insert.
694686
diffs[insPoint+1].Type = DiffInsert
695687
// Throw away the equality we just deleted.
696-
equalities = equalities.next
688+
equalities = equalities[:len(equalities)-1]
697689

698-
if equalities != nil {
699-
equalities = equalities.next
690+
if len(equalities) > 0 {
691+
equalities = equalities[:len(equalities)-1]
700692
}
701-
if equalities != nil {
702-
pointer = equalities.data
703-
} else {
704-
pointer = -1
693+
pointer = -1
694+
if len(equalities) > 0 {
695+
pointer = equalities[len(equalities)-1]
705696
}
706697

707698
lengthInsertions1 = 0 // Reset the counters.

0 commit comments

Comments
 (0)