forked from TrueCloudLab/neoneo-go
291a29af1e
`WriteArray` involves reflection, it makes sense to optimize serialization of transactions and application logs which are serialized constantly. Adding case in a type switch in `WriteArray` is not an option because we don't want new dependencies for `io` package. ``` name old time/op new time/op delta AppExecResult_EncodeBinary-8 852ns ± 3% 656ns ± 2% -22.94% (p=0.000 n=10+9) name old alloc/op new alloc/op delta AppExecResult_EncodeBinary-8 448B ± 0% 376B ± 0% -16.07% (p=0.000 n=10+10) name old allocs/op new allocs/op delta AppExecResult_EncodeBinary-8 7.00 ± 0% 5.00 ± 0% -28.57% (p=0.000 n=10+10) ``` ``` name old time/op new time/op delta Transaction_Bytes-8 1.29µs ± 3% 0.76µs ± 5% -41.52% (p=0.000 n=9+10) name old alloc/op new alloc/op delta Transaction_Bytes-8 1.21kB ± 0% 1.01kB ± 0% -16.56% (p=0.000 n=10+10) name old allocs/op new allocs/op delta Transaction_Bytes-8 12.0 ± 0% 7.0 ± 0% -41.67% (p=0.000 n=10+10) ``` Signed-off-by: Evgeniy Stratonikov <evgeniy@nspcc.ru>
66 lines
1.5 KiB
Go
66 lines
1.5 KiB
Go
package transaction
|
|
|
|
import (
|
|
"encoding/base64"
|
|
"testing"
|
|
|
|
"github.com/nspcc-dev/neo-go/pkg/io"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
// Some typical transfer tx from mainnet.
|
|
var (
|
|
benchTx []byte
|
|
benchTxB64 = "AK9KzFu0P5gAAAAAAIjOEgAAAAAA7jAAAAGIDdjSt7aj2J+dktSobkC9j0/CJwEAWwsCAMLrCwwUtXfkIuockX9HAVMNeEuQMxMlYkMMFIgN2NK3tqPYn52S1KhuQL2PT8InFMAfDAh0cmFuc2ZlcgwUz3bii9AGLEpHjuNVYQETGfPPpNJBYn1bUjkBQgxAUiZNae4OTSu2EOGW+6fwslLIpVsczOAR9o6R796tFf2KG+nLzs709tCQ7NELZOQ7zUzfF19ADLvH/efNT4v9LygMIQNT96/wFdPSBO7NUI9Kpn9EffTRXsS6ZJ9PqRvbenijVEFW57Mn"
|
|
benchTxJSON []byte
|
|
)
|
|
|
|
func init() {
|
|
var err error
|
|
benchTx, err = base64.StdEncoding.DecodeString(benchTxB64)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
t, err := NewTransactionFromBytes(benchTx)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
benchTxJSON, err = t.MarshalJSON()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
|
|
func BenchmarkDecodeBinary(t *testing.B) {
|
|
for n := 0; n < t.N; n++ {
|
|
r := io.NewBinReaderFromBuf(benchTx)
|
|
tx := &Transaction{}
|
|
tx.DecodeBinary(r)
|
|
require.NoError(t, r.Err)
|
|
}
|
|
}
|
|
|
|
func BenchmarkDecodeJSON(t *testing.B) {
|
|
for n := 0; n < t.N; n++ {
|
|
tx := &Transaction{}
|
|
require.NoError(t, tx.UnmarshalJSON(benchTxJSON))
|
|
}
|
|
}
|
|
|
|
func BenchmarkDecodeFromBytes(t *testing.B) {
|
|
for n := 0; n < t.N; n++ {
|
|
_, err := NewTransactionFromBytes(benchTx)
|
|
require.NoError(t, err)
|
|
}
|
|
}
|
|
|
|
func BenchmarkTransaction_Bytes(b *testing.B) {
|
|
tx, err := NewTransactionFromBytes(benchTx)
|
|
require.NoError(b, err)
|
|
|
|
b.ReportAllocs()
|
|
b.ResetTimer()
|
|
for i := 0; i < b.N; i++ {
|
|
_ = tx.Bytes()
|
|
}
|
|
}
|