Skip to content

Commit

Permalink
common/hexutil: improve performance of EncodeBig (#23780)
Browse files Browse the repository at this point in the history
- use Text instead of fmt.Sprintf
- reduced allocs from 6 to 2
- improved speed
  • Loading branch information
lmittmann committed Oct 21, 2021
1 parent b6fb184 commit 2954f40
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 4 deletions.
9 changes: 5 additions & 4 deletions common/hexutil/hexutil.go
Original file line number Diff line number Diff line change
Expand Up @@ -176,13 +176,14 @@ func MustDecodeBig(input string) *big.Int {
}

// EncodeBig encodes bigint as a hex string with 0x prefix.
// The sign of the integer is ignored.
func EncodeBig(bigint *big.Int) string {
nbits := bigint.BitLen()
if nbits == 0 {
if sign := bigint.Sign(); sign == 0 {
return "0x0"
} else if sign > 0 {
return "0x" + bigint.Text(16)
} else {
return "-0x" + bigint.Text(16)[1:]
}
return fmt.Sprintf("%#x", bigint)
}

func has0xPrefix(input string) bool {
Expand Down
12 changes: 12 additions & 0 deletions common/hexutil/hexutil_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -201,3 +201,15 @@ func TestDecodeUint64(t *testing.T) {
}
}
}

func BenchmarkEncodeBig(b *testing.B) {
for _, bench := range encodeBigTests {
b.Run(bench.want, func(b *testing.B) {
b.ReportAllocs()
bigint := bench.input.(*big.Int)
for i := 0; i < b.N; i++ {
EncodeBig(bigint)
}
})
}
}

0 comments on commit 2954f40

Please sign in to comment.