symdiff - skip identical subtrees

This commit is contained in:
Roy Crihfield 2023-09-06 20:12:59 +08:00
parent 91549f449c
commit d1fb6e1f55
2 changed files with 6 additions and 6 deletions

View File

@ -138,10 +138,13 @@ func (it *symmDiffIterator) seek() {
it.yieldFromA = false it.yieldFromA = false
return return
case 0: case 0:
if it.a.Next(true) { // if A and B have the same path and non-zero hash, they are identical and we can skip
// the whole subtree
noHash := it.a.Hash() == common.Hash{}
if it.a.Next(noHash) {
it.count++ it.count++
} }
if it.b.Next(true) { if it.b.Next(noHash) {
it.count++ it.count++
} }
} }
@ -156,9 +159,6 @@ func (it *symmDiffIterator) Error() error {
} }
func compareNodes(a, b trie.NodeIterator) int { func compareNodes(a, b trie.NodeIterator) int {
// if cmp := bytes.Compare(a.Path(), b.Path()); cmp != 0 {
// return cmp
// }
if a.Leaf() && !b.Leaf() { if a.Leaf() && !b.Leaf() {
return -1 return -1
} else if b.Leaf() && !a.Leaf() { } else if b.Leaf() && !a.Leaf() {

View File

@ -50,7 +50,7 @@ func TestSymmetricDifferenceIterator(t *testing.T) {
for di.Next(true) { for di.Next(true) {
t.Errorf("iterator should not yield any elements") t.Errorf("iterator should not yield any elements")
} }
assert.Equal(t, 4, *count) assert.Equal(t, 2, *count)
trieb := trie.NewEmpty(db) trieb := trie.NewEmpty(db)
di, count = utils.NewSymmetricDifferenceIterator(triea.NodeIterator([]byte("food")), trieb.NodeIterator(nil)) di, count = utils.NewSymmetricDifferenceIterator(triea.NodeIterator([]byte("food")), trieb.NodeIterator(nil))