mirror of
https://github.com/nspcc-dev/neo-go.git
synced 2024-11-22 09:29:38 +00:00
f4f87123d1
Close #3601. Signed-off-by: Anna Shaleva <shaleva.ann@nspcc.ru>
485 lines
13 KiB
Go
485 lines
13 KiB
Go
package vm
|
|
|
|
import (
|
|
"encoding/base64"
|
|
"strconv"
|
|
"testing"
|
|
|
|
"github.com/nspcc-dev/neo-go/pkg/vm/opcode"
|
|
"github.com/nspcc-dev/neo-go/pkg/vm/vmstate"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func benchScript(t *testing.B, script []byte) {
|
|
for range t.N {
|
|
t.StopTimer()
|
|
vm := load(script)
|
|
t.StartTimer()
|
|
err := vm.Run()
|
|
t.StopTimer()
|
|
require.NoError(t, err)
|
|
require.Equal(t, vmstate.Halt, vm.State())
|
|
t.StartTimer()
|
|
}
|
|
}
|
|
|
|
func benchBase64Script(t *testing.B, base64Script string) {
|
|
b, err := base64.StdEncoding.DecodeString(base64Script)
|
|
require.NoError(t, err)
|
|
benchScript(t, b)
|
|
}
|
|
|
|
// Shared as is by @ixje once upon a time (compiled from Python).
|
|
func BenchmarkScriptFibonacci(t *testing.B) {
|
|
var script = []byte{87, 5, 0, 16, 112, 17, 113, 105, 104, 18, 192, 114, 16, 115, 34, 28, 104, 105, 158, 116, 106, 108, 75,
|
|
217, 48, 38, 5, 139, 34, 5, 207, 34, 3, 114, 105, 112, 108, 113, 107, 17, 158, 115, 107, 12, 2, 94, 1,
|
|
219, 33, 181, 36, 222, 106, 64}
|
|
benchScript(t, script)
|
|
}
|
|
|
|
func BenchmarkScriptNestedRefCount(t *testing.B) {
|
|
b64script := "whBNEcARTRHAVgEB/gGdYBFNEU0SwFMSwFhKJPNFUUVFRQ=="
|
|
script, err := base64.StdEncoding.DecodeString(b64script)
|
|
require.NoError(t, err)
|
|
benchScript(t, script)
|
|
}
|
|
|
|
func BenchmarkScriptPushPop(t *testing.B) {
|
|
for _, i := range []int{4, 16, 128, 1024} {
|
|
t.Run(strconv.Itoa(i), func(t *testing.B) {
|
|
var script = make([]byte, i*2)
|
|
for p := range i {
|
|
script[p] = byte(opcode.PUSH1)
|
|
script[i+p] = byte(opcode.DROP)
|
|
}
|
|
benchScript(t, script)
|
|
})
|
|
}
|
|
}
|
|
|
|
func BenchmarkIsSignatureContract(t *testing.B) {
|
|
b64script := "DCED2eixa9myLTNF1tTN4xvhw+HRYVMuPQzOy5Xs4utYM25BVuezJw=="
|
|
script, err := base64.StdEncoding.DecodeString(b64script)
|
|
require.NoError(t, err)
|
|
for range t.N {
|
|
_ = IsSignatureContract(script)
|
|
}
|
|
}
|
|
|
|
// BenchmarkNeoIssue2528Compat is a port of benchmark for the case described in
|
|
// https://github.com/neo-project/neo/issues/2528.
|
|
func BenchmarkNeoIssue2528Compat(t *testing.B) {
|
|
// L01: INITSLOT 1, 0
|
|
// L02: NEWARRAY0
|
|
// L03: DUP
|
|
// L04: DUP
|
|
// L05: PUSHINT16 2043
|
|
// L06: STLOC 0
|
|
// L07: PUSH1
|
|
// L08: PACK
|
|
// L09: LDLOC 0
|
|
// L10: DEC
|
|
// L11: STLOC 0
|
|
// L12: LDLOC 0
|
|
// L13: JMPIF_L L07
|
|
// L14: PUSH1
|
|
// L15: PACK
|
|
// L16: APPEND
|
|
// L17: PUSHINT32 38000
|
|
// L18: STLOC 0
|
|
// L19: PUSH0
|
|
// L20: PICKITEM
|
|
// L21: LDLOC 0
|
|
// L22: DEC
|
|
// L23: STLOC 0
|
|
// L24: LDLOC 0
|
|
// L25: JMPIF_L L19
|
|
// L26: DROP
|
|
benchBase64Script(t, "VwEAwkpKAfsHdwARwG8AnXcAbwAl9////xHAzwJwlAAAdwAQzm8AnXcAbwAl9////0U=")
|
|
}
|
|
|
|
// BenchmarkNeoVMIssue418Compat is a port of benchmark for the case described in
|
|
// https://github.com/neo-project/neo-vm/issues/418.
|
|
func BenchmarkNeoVMIssue418Compat(t *testing.B) {
|
|
// L00: NEWARRAY0
|
|
// L01: PUSH0
|
|
// L02: PICK
|
|
// L03: PUSH1
|
|
// L04: PACK
|
|
// L05: PUSH1
|
|
// L06: PICK
|
|
// L07: PUSH1
|
|
// L08: PACK
|
|
// L09: INITSSLOT 1
|
|
// L10: PUSHINT16 510
|
|
// L11: DEC
|
|
// L12: STSFLD0
|
|
// L13: PUSH1
|
|
// L14: PICK
|
|
// L15: PUSH1
|
|
// L16: PICK
|
|
// L17: PUSH2
|
|
// L18: PACK
|
|
// L19: REVERSE3
|
|
// L20: PUSH2
|
|
// L21: PACK
|
|
// L22: LDSFLD0
|
|
// L23: DUP
|
|
// L24: JMPIF L11
|
|
// L25: DROP
|
|
// L26: ROT
|
|
// L27: DROP
|
|
benchBase64Script(t, "whBNEcARTRHAVgEB/gGdYBFNEU0SwFMSwFhKJPNFUUU=")
|
|
}
|
|
|
|
// BenchmarkNeoIssue2723Compat is a port of benchmark for the case described in
|
|
// https://github.com/neo-project/neo/issues/2723.
|
|
func BenchmarkNeoIssue2723Compat(t *testing.B) {
|
|
// L00: INITSSLOT 1
|
|
// L01: PUSHINT32 130000
|
|
// L02: STSFLD 0
|
|
// L03: PUSHINT32 1048576
|
|
// L04: NEWBUFFER
|
|
// L05: DROP
|
|
// L06: LDSFLD 0
|
|
// L07: DEC
|
|
// L08: DUP
|
|
// L09: STSFLD 0
|
|
// L10: JMPIF L03
|
|
benchBase64Script(t, "VgEC0PsBAGcAAgAAEACIRV8AnUpnACTz")
|
|
// TODO
|
|
}
|
|
|
|
// BenchmarkPoCNewBufferCompat is a port of benchmark introduced in
|
|
// https://github.com/neo-project/neo/pull/3512.
|
|
func BenchmarkPoCNewBufferCompat(t *testing.B) {
|
|
// INITSLOT 0100
|
|
// PUSHINT32 23000000
|
|
// STLOC 00
|
|
// PUSHINT32 1048576
|
|
// NEWBUFFER
|
|
// DROP
|
|
// LDLOC 00
|
|
// DEC
|
|
// STLOC 00
|
|
// LDLOC 00
|
|
// JMPIF_L f2ffffff
|
|
// CLEAR
|
|
// RET
|
|
benchBase64Script(t, "VwEAAsDzXgF3AAIAABAAiEVvAJ13AG8AJfL///9JQA==")
|
|
// TODO:
|
|
// BenchmarkPoCNewBufferCompat
|
|
// bench_test.go:20:
|
|
// Error Trace: /home/anna/Documents/GitProjects/nspcc-dev/neo-go/pkg/vm/bench_test.go:20
|
|
// /home/anna/Documents/GitProjects/nspcc-dev/neo-go/pkg/vm/bench_test.go:29
|
|
// /home/anna/Documents/GitProjects/nspcc-dev/neo-go/pkg/vm/bench_test.go:168
|
|
// Error: Received unexpected error:
|
|
// at instruction 15 (NEWBUFFER): invalid size
|
|
// Test: BenchmarkPoCNewBufferCompat
|
|
}
|
|
|
|
// BenchmarkPoCCatCompat is a port of benchmark introduced in
|
|
// https://github.com/neo-project/neo/pull/3512.
|
|
func BenchmarkPoCCatCompat(t *testing.B) {
|
|
// INITSLOT 0100
|
|
// PUSHINT32 1048575
|
|
// NEWBUFFER
|
|
// PUSH1
|
|
// NEWBUFFER
|
|
// PUSHINT32 133333337
|
|
// STLOC 00
|
|
// OVER
|
|
// OVER
|
|
// CAT
|
|
// DROP
|
|
// LDLOC 00
|
|
// DEC
|
|
// STLOC 00
|
|
// LDLOC 00
|
|
// JMPIF_L f5ffffff
|
|
// CLEAR
|
|
// RET
|
|
benchBase64Script(t, "VwEAAv//DwCIEYgCWYHyB3cAS0uLRW8AnXcAbwAl9f///0lA")
|
|
// TODO:
|
|
// BenchmarkPoCCatCompat
|
|
// bench_test.go:20:
|
|
// Error Trace: /home/anna/Documents/GitProjects/nspcc-dev/neo-go/pkg/vm/bench_test.go:20
|
|
// /home/anna/Documents/GitProjects/nspcc-dev/neo-go/pkg/vm/bench_test.go:29
|
|
// /home/anna/Documents/GitProjects/nspcc-dev/neo-go/pkg/vm/bench_test.go:192
|
|
// Error: Received unexpected error:
|
|
// at instruction 8 (NEWBUFFER): invalid size
|
|
// Test: BenchmarkPoCCatCompat
|
|
}
|
|
|
|
// BenchmarkPoCLeftCompat is a port of benchmark introduced in
|
|
// https://github.com/neo-project/neo/pull/3512.
|
|
func BenchmarkPoCLeftCompat(t *testing.B) {
|
|
// INITSLOT 0100
|
|
// PUSHINT32 1048576
|
|
// NEWBUFFER
|
|
// PUSHINT32 133333337
|
|
// STLOC 00
|
|
// DUP
|
|
// PUSHINT32 1048576
|
|
// LEFT
|
|
// DROP
|
|
// LDLOC 00
|
|
// DEC
|
|
// STLOC 00
|
|
// LDLOC 00
|
|
// JMPIF_L f1ffffff
|
|
// CLEAR
|
|
// RET
|
|
benchBase64Script(t, "VwEAAgAAEACIAlmB8gd3AEoCAAAQAI1FbwCddwBvACXx////SUA=")
|
|
// TODO:
|
|
// BenchmarkPoCLeftCompat
|
|
// bench_test.go:20:
|
|
// Error Trace: /home/anna/Documents/GitProjects/nspcc-dev/neo-go/pkg/vm/bench_test.go:20
|
|
// /home/anna/Documents/GitProjects/nspcc-dev/neo-go/pkg/vm/bench_test.go:29
|
|
// /home/anna/Documents/GitProjects/nspcc-dev/neo-go/pkg/vm/bench_test.go:214
|
|
// Error: Received unexpected error:
|
|
// at instruction 8 (NEWBUFFER): invalid size
|
|
// Test: BenchmarkPoCLeftCompat
|
|
}
|
|
|
|
// BenchmarkPoCRightCompat is a port of benchmark introduced in
|
|
// https://github.com/neo-project/neo/pull/3512.
|
|
func BenchmarkPoCRightCompat(t *testing.B) {
|
|
// INITSLOT 0100
|
|
// PUSHINT32 1048576
|
|
// NEWBUFFER
|
|
// PUSHINT32 133333337
|
|
// STLOC 00
|
|
// DUP
|
|
// PUSHINT32 1048576
|
|
// RIGHT
|
|
// DROP
|
|
// LDLOC 00
|
|
// DEC
|
|
// STLOC 00
|
|
// LDLOC 00
|
|
// JMPIF_L f1ffffff
|
|
// CLEAR
|
|
// RET
|
|
benchBase64Script(t, "VwEAAgAAEACIAlmB8gd3AEoCAAAQAI5FbwCddwBvACXx////SUA=")
|
|
// TODO:
|
|
// BenchmarkPoCRightCompat
|
|
// bench_test.go:20:
|
|
// Error Trace: /home/anna/Documents/GitProjects/nspcc-dev/neo-go/pkg/vm/bench_test.go:20
|
|
// /home/anna/Documents/GitProjects/nspcc-dev/neo-go/pkg/vm/bench_test.go:29
|
|
// /home/anna/Documents/GitProjects/nspcc-dev/neo-go/pkg/vm/bench_test.go:236
|
|
// Error: Received unexpected error:
|
|
// at instruction 8 (NEWBUFFER): invalid size
|
|
// Test: BenchmarkPoCRightCompat
|
|
}
|
|
|
|
// BenchmarkPoCReverseNCompat is a port of benchmark introduced in
|
|
// https://github.com/neo-project/neo/pull/3512.
|
|
func BenchmarkPoCReverseNCompat(t *testing.B) {
|
|
// INITSLOT 0100
|
|
// PUSHINT16 2040
|
|
// STLOC 00
|
|
// PUSHDATA1 aaabbbbbbbbbcccccccdddddddeeeeeeefffffff
|
|
// LDLOC 00
|
|
// DEC
|
|
// STLOC 00
|
|
// LDLOC 00
|
|
// JMPIF_L cfffffff
|
|
// PUSHINT32 23000000
|
|
// STLOC 00
|
|
// PUSHINT16 2040
|
|
// REVERSEN
|
|
// LDLOC 00
|
|
// DEC
|
|
// STLOC 00
|
|
// LDLOC 00
|
|
// JMPIF_L f5ffffff
|
|
// CLEAR
|
|
// RET
|
|
benchBase64Script(t, "VwEAAfgHdwAMKGFhYWJiYmJiYmJiYmNjY2NjY2NkZGRkZGRkZWVlZWVlZWZmZmZmZmZvAJ13AG8AJc////8CwPNeAXcAAfgHVW8AnXcAbwAl9f///0lA")
|
|
}
|
|
|
|
// BenchmarkPoCSubstrCompat is a port of benchmark introduced in
|
|
// https://github.com/neo-project/neo/pull/3512.
|
|
func BenchmarkPoCSubstrCompat(t *testing.B) {
|
|
// INITSLOT 0100
|
|
// PUSHINT32 1048576
|
|
// NEWBUFFER
|
|
// PUSHINT32 133333337
|
|
// STLOC 00
|
|
// DUP
|
|
// PUSH0
|
|
// PUSHINT32 1048576
|
|
// SUBSTR
|
|
// DROP
|
|
// LDLOC 00
|
|
// DEC
|
|
// STLOC 00
|
|
// LDLOC 00
|
|
// JMPIF_L f0ffffff
|
|
// CLEAR
|
|
// RET
|
|
benchBase64Script(t, "VwEAAgAAEACIAlmB8gd3AEoQAgAAEACMRW8AnXcAbwAl8P///0lA")
|
|
// TODO:
|
|
// bench_test.go:20:
|
|
// Error Trace: /home/anna/Documents/GitProjects/nspcc-dev/neo-go/pkg/vm/bench_test.go:20
|
|
// /home/anna/Documents/GitProjects/nspcc-dev/neo-go/pkg/vm/bench_test.go:29
|
|
// /home/anna/Documents/GitProjects/nspcc-dev/neo-go/pkg/vm/bench_test.go:285
|
|
// Error: Received unexpected error:
|
|
// at instruction 8 (NEWBUFFER): invalid size
|
|
// Test: BenchmarkPoCSubstrCompat
|
|
}
|
|
|
|
// BenchmarkPoCNewArray is a port of benchmark introduced in
|
|
// https://github.com/neo-project/neo/pull/3512.
|
|
func BenchmarkPoCNewArray(t *testing.B) {
|
|
// INITSLOT 0100
|
|
// PUSHINT32 1333333337
|
|
// STLOC 00
|
|
// PUSHINT16 2040
|
|
// NEWARRAY
|
|
// DROP
|
|
// LDLOC 00
|
|
// DEC
|
|
// STLOC 00
|
|
// LDLOC 00
|
|
// JMPIF_L f4ffffff
|
|
// RET
|
|
benchBase64Script(t, "VwEAAlkNeU93AAH4B8NFbwCddwBvACX0////QA==")
|
|
}
|
|
|
|
// BenchmarkPoCNewStructCompat is a port of benchmark introduced in
|
|
// https://github.com/neo-project/neo/pull/3512.
|
|
func BenchmarkPoCNewStructCompat(t *testing.B) {
|
|
// INITSLOT 0100
|
|
// PUSHINT32 1333333337
|
|
// STLOC 00
|
|
// PUSHINT16 2040
|
|
// NEWSTRUCT
|
|
// DROP
|
|
// LDLOC 00
|
|
// DEC
|
|
// STLOC 00
|
|
// LDLOC 00
|
|
// JMPIF_L f4ffffff
|
|
// RET
|
|
benchBase64Script(t, "VwEAAlkNeU93AAH4B8ZFbwCddwBvACX0////QA==")
|
|
}
|
|
|
|
// BenchmarkPoCRollCompat is a port of benchmark introduced in
|
|
// https://github.com/neo-project/neo/pull/3512.
|
|
func BenchmarkPoCRollCompat(t *testing.B) {
|
|
// INITSLOT 0100
|
|
// PUSHINT16 2040
|
|
// STLOC 00
|
|
// PUSHDATA1 aaabbbbbbbbbcccccccdddddddeeeeeeefffffff
|
|
// LDLOC 00
|
|
// DEC
|
|
// STLOC 00
|
|
// LDLOC 00
|
|
// JMPIF_L cfffffff
|
|
// PUSHINT32 23000000
|
|
// STLOC 00
|
|
// PUSHINT16 2039
|
|
// ROLL
|
|
// LDLOC 00
|
|
// DEC
|
|
// STLOC 00
|
|
// LDLOC 00
|
|
// JMPIF_L f5ffffff
|
|
// CLEAR
|
|
// RET
|
|
benchBase64Script(t, "VwEAAfgHdwAMKGFhYWJiYmJiYmJiYmNjY2NjY2NkZGRkZGRkZWVlZWVlZWZmZmZmZmZvAJ13AG8AJc////8CwPNeAXcAAfcHUm8AnXcAbwAl9f///0lA")
|
|
}
|
|
|
|
// BenchmarkPoCXDropCompat is a port of benchmark introduced in
|
|
// https://github.com/neo-project/neo/pull/3512.
|
|
func BenchmarkPoCXDropCompat(t *testing.B) {
|
|
// INITSLOT 0100
|
|
// PUSHINT16 2040
|
|
// STLOC 00
|
|
// PUSHDATA1 aaabbbbbbbbbcccccccdddddddeeeeeeefffffff
|
|
// LDLOC 00
|
|
// DEC
|
|
// STLOC 00
|
|
// LDLOC 00
|
|
// JMPIF_L cfffffff
|
|
// PUSHINT32 23000000
|
|
// STLOC 00
|
|
// PUSHINT16 2039
|
|
// XDROP
|
|
// DUP
|
|
// LDLOC 00
|
|
// DEC
|
|
// STLOC 00
|
|
// LDLOC 00
|
|
// JMPIF_L f4ffffff
|
|
// CLEAR
|
|
// RET
|
|
benchBase64Script(t, "VwEAAfgHdwAMKGFhYWJiYmJiYmJiYmNjY2NjY2NkZGRkZGRkZWVlZWVlZWZmZmZmZmZvAJ13AG8AJc////8CwPNeAXcAAfcHSEpvAJ13AG8AJfT///9JQA==")
|
|
}
|
|
|
|
// BenchmarkPoCMemCpyBenchmark is a port of benchmark introduced in
|
|
// https://github.com/neo-project/neo/pull/3512.
|
|
func BenchmarkPoCMemCpyBenchmark(t *testing.B) {
|
|
// INITSLOT 0100
|
|
// PUSHINT32 1048576
|
|
// NEWBUFFER
|
|
// PUSHINT32 1048576
|
|
// NEWBUFFER
|
|
// PUSHINT32 133333337
|
|
// STLOC 00
|
|
// OVER
|
|
// PUSH0
|
|
// PUSH2
|
|
// PICK
|
|
// PUSH0
|
|
// PUSHINT32 1048576
|
|
// MEMCPY
|
|
// LDLOC 00
|
|
// DEC
|
|
// STLOC 00
|
|
// LDLOC 00
|
|
// JMPIF_L eeffffff
|
|
// CLEAR
|
|
// RET
|
|
benchBase64Script(t, "VwEAAgAAEACIAgAAEACIAlmB8gd3AEsQEk0QAgAAEACJbwCddwBvACXu////SUA=")
|
|
// TODO:
|
|
// bench_test.go:20:
|
|
// Error Trace: /home/anna/Documents/GitProjects/nspcc-dev/neo-go/pkg/vm/bench_test.go:20
|
|
// /home/anna/Documents/GitProjects/nspcc-dev/neo-go/pkg/vm/bench_test.go:29
|
|
// /home/anna/Documents/GitProjects/nspcc-dev/neo-go/pkg/vm/bench_test.go:401
|
|
// Error: Received unexpected error:
|
|
// at instruction 8 (NEWBUFFER): invalid size
|
|
// Test: BenchmarkPoCMemCpyBenchmark
|
|
}
|
|
|
|
// BenchmarkPoCUnpackCompat is a port of benchmark introduced in
|
|
// https://github.com/neo-project/neo/pull/3512.
|
|
func BenchmarkPoCUnpackCompat(t *testing.B) {
|
|
// INITSLOT 0200
|
|
// PUSHINT16 1010
|
|
// NEWARRAY
|
|
// STLOC 01
|
|
// PUSHINT32 1333333337
|
|
// STLOC 00
|
|
// LDLOC 01
|
|
// UNPACK
|
|
// CLEAR
|
|
// LDLOC 00
|
|
// DEC
|
|
// STLOC 00
|
|
// LDLOC 00
|
|
// JMPIF_L f5ffffff
|
|
// RET
|
|
benchBase64Script(t, "VwIAAfIDw3cBAlkNeU93AG8BwUlvAJ13AG8AJfX///9A")
|
|
}
|
|
|
|
// BenchmarkPoCGetScriptContainerCompat is a port of benchmark introduced in
|
|
// https://github.com/neo-project/neo/pull/3512.
|
|
func BenchmarkPoCGetScriptContainerCompat(t *testing.B) {
|
|
// SYSCALL System.Runtime.GetScriptContainer
|
|
// DROP
|
|
// JMP fa
|
|
benchBase64Script(t, "QS1RCDBFIvo=")
|
|
}
|