Merge pull request #559 from nspcc-dev/feature/stack_limits

vm: don't refcount simple items

Improves 1.4M to 1.5M 100K mainnet block import test by ~4%.
This commit is contained in:
Roman Khimov 2019-12-23 12:44:01 +03:00 committed by GitHub
commit 33958be45f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -214,19 +214,21 @@ func (s *Stack) insert(e, at *Element) *Element {
func (s *Stack) updateSizeAdd(item StackItem) { func (s *Stack) updateSizeAdd(item StackItem) {
*s.size++ *s.size++
s.itemCount[item]++ switch item.(type) {
if s.itemCount[item] > 1 { case *ArrayItem, *StructItem, *MapItem:
return if s.itemCount[item]++; s.itemCount[item] > 1 {
} return
switch t := item.(type) {
case *ArrayItem, *StructItem:
for _, it := range item.Value().([]StackItem) {
s.updateSizeAdd(it)
} }
case *MapItem:
for _, v := range t.value { switch t := item.(type) {
s.updateSizeAdd(v) case *ArrayItem, *StructItem:
for _, it := range item.Value().([]StackItem) {
s.updateSizeAdd(it)
}
case *MapItem:
for _, v := range t.value {
s.updateSizeAdd(v)
}
} }
} }
} }
@ -234,21 +236,24 @@ func (s *Stack) updateSizeAdd(item StackItem) {
func (s *Stack) updateSizeRemove(item StackItem) { func (s *Stack) updateSizeRemove(item StackItem) {
*s.size-- *s.size--
if s.itemCount[item] > 1 { switch item.(type) {
s.itemCount[item]-- case *ArrayItem, *StructItem, *MapItem:
return if s.itemCount[item] > 1 {
} s.itemCount[item]--
return
delete(s.itemCount, item)
switch t := item.(type) {
case *ArrayItem, *StructItem:
for _, it := range item.Value().([]StackItem) {
s.updateSizeRemove(it)
} }
case *MapItem:
for _, v := range t.value { delete(s.itemCount, item)
s.updateSizeRemove(v)
switch t := item.(type) {
case *ArrayItem, *StructItem:
for _, it := range item.Value().([]StackItem) {
s.updateSizeRemove(it)
}
case *MapItem:
for _, v := range t.value {
s.updateSizeRemove(v)
}
} }
} }
} }