util: optimize MarshalJSON allocations

name                  old time/op    new time/op    delta
Uint256MarshalJSON-8     230ns ± 6%      83ns ±13%  -63.78%  (p=0.000 n=8+10)

name                  old alloc/op   new alloc/op   delta
Uint256MarshalJSON-8      320B ± 0%       80B ± 0%  -75.00%  (p=0.000 n=10+10)

name                  old allocs/op  new allocs/op  delta
Uint256MarshalJSON-8      5.00 ± 0%      1.00 ± 0%  -80.00%  (p=0.000 n=10+10)
This commit is contained in:
Roman Khimov 2022-06-01 11:26:36 +03:00
parent 9a06995460
commit b0744c2b21
3 changed files with 25 additions and 2 deletions

13
pkg/util/bench_test.go Normal file
View file

@ -0,0 +1,13 @@
package util
import (
"testing"
)
func BenchmarkUint256MarshalJSON(b *testing.B) {
v := Uint256{0x01, 0x02, 0x03}
for i := 0; i < b.N; i++ {
_, _ = v.MarshalJSON()
}
}

View file

@ -132,7 +132,12 @@ func (u *Uint160) UnmarshalJSON(data []byte) (err error) {
// MarshalJSON implements the json marshaller interface.
func (u Uint160) MarshalJSON() ([]byte, error) {
return []byte(`"0x` + u.StringLE() + `"`), nil
r := make([]byte, 3+Uint160Size*2+1)
copy(r, `"0x`)
r[len(r)-1] = '"'
slice.Reverse(u[:]) // u is a copy, so we can mangle it in any way.
hex.Encode(r[3:], u[:])
return r, nil
}
// UnmarshalYAML implements the YAML Unmarshaler interface.

View file

@ -109,7 +109,12 @@ func (u *Uint256) UnmarshalJSON(data []byte) (err error) {
// MarshalJSON implements the json marshaller interface.
func (u Uint256) MarshalJSON() ([]byte, error) {
return []byte(`"0x` + u.StringLE() + `"`), nil
r := make([]byte, 3+Uint256Size*2+1)
copy(r, `"0x`)
r[len(r)-1] = '"'
slice.Reverse(u[:]) // u is a copy, so we can mangle it in any way.
hex.Encode(r[3:], u[:])
return r, nil
}
// CompareTo compares two Uint256 with each other. Possible output: 1, -1, 0