* core/vm/runtime/tests: add more benchmarks * core/vm: initial work on improving alloc count for calls to precompiles name old time/op new time/op delta SimpleLoop/identity-precompile-10M-6 117ms ±75% 43ms ± 1% -63.09% (p=0.008 n=5+5) SimpleLoop/loop-10M-6 79.6ms ± 4% 70.5ms ± 1% -11.42% (p=0.008 n=5+5) name old alloc/op new alloc/op delta SimpleLoop/identity-precompile-10M-6 24.4MB ± 0% 4.9MB ± 0% -79.94% (p=0.008 n=5+5) SimpleLoop/loop-10M-6 13.2kB ± 0% 13.2kB ± 0% ~ (p=0.357 n=5+5) name old allocs/op new allocs/op delta SimpleLoop/identity-precompile-10M-6 382k ± 0% 153k ± 0% -59.99% (p=0.000 n=5+4) SimpleLoop/loop-10M-6 40.0 ± 0% 40.0 ± 0% ~ (all equal) * core/vm: don't allocate big.int for touch name old time/op new time/op delta SimpleLoop/identity-precompile-10M-6 43.3ms ± 1% 42.4ms ± 7% ~ (p=0.151 n=5+5) SimpleLoop/loop-10M-6 70.5ms ± 1% 76.7ms ± 1% +8.67% (p=0.008 n=5+5) name old alloc/op new alloc/op delta SimpleLoop/identity-precompile-10M-6 4.90MB ± 0% 2.46MB ± 0% -49.83% (p=0.008 n=5+5) SimpleLoop/loop-10M-6 13.2kB ± 0% 13.2kB ± 1% ~ (p=0.571 n=5+5) name old allocs/op new allocs/op delta SimpleLoop/identity-precompile-10M-6 153k ± 0% 76k ± 0% -49.98% (p=0.029 n=4+4) SimpleLoop/loop-10M-6 40.0 ± 0% 40.0 ± 0% ~ (all equal) * core/vm: reduce allocs in staticcall name old time/op new time/op delta SimpleLoop/identity-precompile-10M-6 42.4ms ± 7% 37.5ms ± 6% -11.68% (p=0.008 n=5+5) SimpleLoop/loop-10M-6 76.7ms ± 1% 69.1ms ± 1% -9.82% (p=0.008 n=5+5) name old alloc/op new alloc/op delta SimpleLoop/identity-precompile-10M-6 2.46MB ± 0% 0.02MB ± 0% -99.35% (p=0.008 n=5+5) SimpleLoop/loop-10M-6 13.2kB ± 1% 13.2kB ± 0% ~ (p=0.143 n=5+5) name old allocs/op new allocs/op delta SimpleLoop/identity-precompile-10M-6 76.4k ± 0% 0.1k ± 0% ~ (p=0.079 n=4+5) SimpleLoop/loop-10M-6 40.0 ± 0% 40.0 ± 0% ~ (all equal) * trie: better use of hasher keccakState * core/state/statedb: reduce allocations in getDeletedStateObject * core/vm: reduce allocations in all call derivates * core/vm: reduce allocations in call variants - Make returnstack `uint32` - Use a `sync.Pool` of `stack`s * core/vm: fix tests * core/vm: goimports * core/vm: tracer fix + staticcall gas fix * core/vm: add back snapshot to staticcall * core/vm: review concerns + make returnstack pooled + enable returndata in traces * core/vm: fix some test tracer method signatures * core/vm: run gencodec, minor comment polish Co-authored-by: Péter Szilágyi <peterke@gmail.com>
		
			
				
	
	
		
			132 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			132 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Code generated by github.com/fjl/gencodec. DO NOT EDIT.
 | |
| 
 | |
| package vm
 | |
| 
 | |
| import (
 | |
| 	"encoding/json"
 | |
| 	"math/big"
 | |
| 
 | |
| 	"github.com/ethereum/go-ethereum/common"
 | |
| 	"github.com/ethereum/go-ethereum/common/hexutil"
 | |
| 	"github.com/ethereum/go-ethereum/common/math"
 | |
| )
 | |
| 
 | |
| var _ = (*structLogMarshaling)(nil)
 | |
| 
 | |
| // MarshalJSON marshals as JSON.
 | |
| func (s StructLog) MarshalJSON() ([]byte, error) {
 | |
| 	type StructLog struct {
 | |
| 		Pc            uint64                      `json:"pc"`
 | |
| 		Op            OpCode                      `json:"op"`
 | |
| 		Gas           math.HexOrDecimal64         `json:"gas"`
 | |
| 		GasCost       math.HexOrDecimal64         `json:"gasCost"`
 | |
| 		Memory        hexutil.Bytes               `json:"memory"`
 | |
| 		MemorySize    int                         `json:"memSize"`
 | |
| 		Stack         []*math.HexOrDecimal256     `json:"stack"`
 | |
| 		ReturnStack   []math.HexOrDecimal64       `json:"returnStack"`
 | |
| 		ReturnData    []byte                      `json:"returnData"`
 | |
| 		Storage       map[common.Hash]common.Hash `json:"-"`
 | |
| 		Depth         int                         `json:"depth"`
 | |
| 		RefundCounter uint64                      `json:"refund"`
 | |
| 		Err           error                       `json:"-"`
 | |
| 		OpName        string                      `json:"opName"`
 | |
| 		ErrorString   string                      `json:"error"`
 | |
| 	}
 | |
| 	var enc StructLog
 | |
| 	enc.Pc = s.Pc
 | |
| 	enc.Op = s.Op
 | |
| 	enc.Gas = math.HexOrDecimal64(s.Gas)
 | |
| 	enc.GasCost = math.HexOrDecimal64(s.GasCost)
 | |
| 	enc.Memory = s.Memory
 | |
| 	enc.MemorySize = s.MemorySize
 | |
| 	if s.Stack != nil {
 | |
| 		enc.Stack = make([]*math.HexOrDecimal256, len(s.Stack))
 | |
| 		for k, v := range s.Stack {
 | |
| 			enc.Stack[k] = (*math.HexOrDecimal256)(v)
 | |
| 		}
 | |
| 	}
 | |
| 	if s.ReturnStack != nil {
 | |
| 		enc.ReturnStack = make([]math.HexOrDecimal64, len(s.ReturnStack))
 | |
| 		for k, v := range s.ReturnStack {
 | |
| 			enc.ReturnStack[k] = math.HexOrDecimal64(v)
 | |
| 		}
 | |
| 	}
 | |
| 	enc.ReturnData = s.ReturnData
 | |
| 	enc.Storage = s.Storage
 | |
| 	enc.Depth = s.Depth
 | |
| 	enc.RefundCounter = s.RefundCounter
 | |
| 	enc.Err = s.Err
 | |
| 	enc.OpName = s.OpName()
 | |
| 	enc.ErrorString = s.ErrorString()
 | |
| 	return json.Marshal(&enc)
 | |
| }
 | |
| 
 | |
| // UnmarshalJSON unmarshals from JSON.
 | |
| func (s *StructLog) UnmarshalJSON(input []byte) error {
 | |
| 	type StructLog struct {
 | |
| 		Pc            *uint64                     `json:"pc"`
 | |
| 		Op            *OpCode                     `json:"op"`
 | |
| 		Gas           *math.HexOrDecimal64        `json:"gas"`
 | |
| 		GasCost       *math.HexOrDecimal64        `json:"gasCost"`
 | |
| 		Memory        *hexutil.Bytes              `json:"memory"`
 | |
| 		MemorySize    *int                        `json:"memSize"`
 | |
| 		Stack         []*math.HexOrDecimal256     `json:"stack"`
 | |
| 		ReturnStack   []math.HexOrDecimal64       `json:"returnStack"`
 | |
| 		ReturnData    []byte                      `json:"returnData"`
 | |
| 		Storage       map[common.Hash]common.Hash `json:"-"`
 | |
| 		Depth         *int                        `json:"depth"`
 | |
| 		RefundCounter *uint64                     `json:"refund"`
 | |
| 		Err           error                       `json:"-"`
 | |
| 	}
 | |
| 	var dec StructLog
 | |
| 	if err := json.Unmarshal(input, &dec); err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	if dec.Pc != nil {
 | |
| 		s.Pc = *dec.Pc
 | |
| 	}
 | |
| 	if dec.Op != nil {
 | |
| 		s.Op = *dec.Op
 | |
| 	}
 | |
| 	if dec.Gas != nil {
 | |
| 		s.Gas = uint64(*dec.Gas)
 | |
| 	}
 | |
| 	if dec.GasCost != nil {
 | |
| 		s.GasCost = uint64(*dec.GasCost)
 | |
| 	}
 | |
| 	if dec.Memory != nil {
 | |
| 		s.Memory = *dec.Memory
 | |
| 	}
 | |
| 	if dec.MemorySize != nil {
 | |
| 		s.MemorySize = *dec.MemorySize
 | |
| 	}
 | |
| 	if dec.Stack != nil {
 | |
| 		s.Stack = make([]*big.Int, len(dec.Stack))
 | |
| 		for k, v := range dec.Stack {
 | |
| 			s.Stack[k] = (*big.Int)(v)
 | |
| 		}
 | |
| 	}
 | |
| 	if dec.ReturnStack != nil {
 | |
| 		s.ReturnStack = make([]uint32, len(dec.ReturnStack))
 | |
| 		for k, v := range dec.ReturnStack {
 | |
| 			s.ReturnStack[k] = uint32(v)
 | |
| 		}
 | |
| 	}
 | |
| 	if dec.ReturnData != nil {
 | |
| 		s.ReturnData = dec.ReturnData
 | |
| 	}
 | |
| 	if dec.Storage != nil {
 | |
| 		s.Storage = dec.Storage
 | |
| 	}
 | |
| 	if dec.Depth != nil {
 | |
| 		s.Depth = *dec.Depth
 | |
| 	}
 | |
| 	if dec.RefundCounter != nil {
 | |
| 		s.RefundCounter = *dec.RefundCounter
 | |
| 	}
 | |
| 	if dec.Err != nil {
 | |
| 		s.Err = dec.Err
 | |
| 	}
 | |
| 	return nil
 | |
| }
 |