vm: optimize SWAP instruction, refactor common code
Add `Swap` method to the Stack and use it for both SWAP and XSWAP. Avoid element popping and pushing (and associated accounting costs). 1.4M->1.5M 100K block import test before: real 3m51,885s user 5m54,744s sys 0m38,444s After: real 3m44,292s user 5m43,494s sys 0m34,741s
This commit is contained in:
parent
b78896f2e1
commit
2627628387
4 changed files with 115 additions and 30 deletions
|
@ -226,22 +226,36 @@ func TestSwapElemValues(t *testing.T) {
|
|||
s.PushVal(2)
|
||||
s.PushVal(4)
|
||||
|
||||
a := s.Peek(0)
|
||||
b := s.Peek(1)
|
||||
|
||||
// [ 4 ] -> a
|
||||
// [ 2 ] -> b
|
||||
|
||||
aval := a.value
|
||||
bval := b.value
|
||||
a.value = bval
|
||||
b.value = aval
|
||||
|
||||
// [ 2 ] -> a
|
||||
// [ 4 ] -> b
|
||||
|
||||
assert.NoError(t, s.Swap(0, 1))
|
||||
assert.Equal(t, int64(2), s.Pop().BigInt().Int64())
|
||||
assert.Equal(t, int64(4), s.Pop().BigInt().Int64())
|
||||
|
||||
s.PushVal(1)
|
||||
s.PushVal(2)
|
||||
s.PushVal(3)
|
||||
s.PushVal(4)
|
||||
|
||||
assert.NoError(t, s.Swap(1, 3))
|
||||
assert.Equal(t, int64(4), s.Pop().BigInt().Int64())
|
||||
assert.Equal(t, int64(1), s.Pop().BigInt().Int64())
|
||||
assert.Equal(t, int64(2), s.Pop().BigInt().Int64())
|
||||
assert.Equal(t, int64(3), s.Pop().BigInt().Int64())
|
||||
|
||||
s.PushVal(1)
|
||||
s.PushVal(2)
|
||||
s.PushVal(3)
|
||||
s.PushVal(4)
|
||||
|
||||
assert.Error(t, s.Swap(-1, 0))
|
||||
assert.Error(t, s.Swap(0, -3))
|
||||
assert.Error(t, s.Swap(0, 4))
|
||||
assert.Error(t, s.Swap(5, 0))
|
||||
|
||||
assert.NoError(t, s.Swap(1, 1))
|
||||
assert.Equal(t, int64(4), s.Pop().BigInt().Int64())
|
||||
assert.Equal(t, int64(3), s.Pop().BigInt().Int64())
|
||||
assert.Equal(t, int64(2), s.Pop().BigInt().Int64())
|
||||
assert.Equal(t, int64(1), s.Pop().BigInt().Int64())
|
||||
}
|
||||
|
||||
func TestPopSigElements(t *testing.T) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue