From b93c0c890c6bf7d64bdb672c89e3d74b4fcb1f44 Mon Sep 17 00:00:00 2001 From: Mateus Veloso Date: Wed, 8 Nov 2023 01:25:13 -0300 Subject: [PATCH] Optimize memory allocation in appendRune function (#1988) * Optimize memory allocation in appendRune function * Add benchmark tests for appendRune function memory allocation * remove function * remove old --- types/append.go | 4 +++- types/append_test.go | 17 +++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 types/append_test.go diff --git a/types/append.go b/types/append.go index 05be2a0f..342d478b 100644 --- a/types/append.go +++ b/types/append.go @@ -160,7 +160,9 @@ func appendRune(b []byte, r rune) []byte { } l := len(b) if cap(b)-l < utf8.UTFMax { - b = append(b, make([]byte, utf8.UTFMax)...) + nb := make([]byte, l, 2*l+utf8.UTFMax) + copy(nb, b) + b = nb } n := utf8.EncodeRune(b[l:l+utf8.UTFMax], r) return b[:l+n] diff --git a/types/append_test.go b/types/append_test.go new file mode 100644 index 00000000..5a2df1cc --- /dev/null +++ b/types/append_test.go @@ -0,0 +1,17 @@ +package types + +import ( + "testing" +) + +func BenchmarkAppendRuneNew(b *testing.B) { + for i := 0; i < b.N; i++ { + b.StopTimer() + s := make([]byte, 0, 1024) + b.StartTimer() + + for j := 0; j < 1000000; j++ { + s = appendRune(s, 'δΈ–') + } + } +}