ast: improve String() performance for arrays, sets, objects (#3757)
Before had been creating slices of strings and passed them to strings.Join. Now, we're directly making use of a strings.Builder. The added benchmarks include comparisons to the stdlib json.Marshal method. Only looking at the String() method's performance, we find this benchstat output: name old time/op new time/op delta ObjectString/5/String()-16 2.47µs ± 3% 0.82µs ± 3% -66.64% (p=0.008 n=5+5) ObjectString/50/String()-16 26.1µs ± 3% 10.4µs ± 3% -60.37% (p=0.008 n=5+5) ObjectString/500/String()-16 307µs ± 4% 173µs ± 4% -43.61% (p=0.008 n=5+5) ObjectString/5000/String()-16 3.81ms ± 4% 2.33ms ± 1% -38.84% (p=0.008 n=5+5) ArrayString/5/String()-16 801ns ± 7% 456ns ± 3% -43.09% (p=0.008 n=5+5) ArrayString/50/String()-16 5.28µs ± 1% 3.94µs ± 4% -25.32% (p=0.008 n=5+5) ArrayString/500/String()-16 53.9µs ± 2% 45.9µs ± 2% -14.72% (p=0.016 n=5+4) ArrayString/5000/String()-16 555µs ± 1% 429µs ± 3% -22.72% (p=0.016 n=4+5) SetString/5/String()-16 1.69µs ± 4% 0.44µs ± 3% -73.71% (p=0.008 n=5+5) SetString/50/String()-16 17.3µs ± 4% 7.2µs ± 3% -58.27% (p=0.008 n=5+5) SetString/500/String()-16 244µs ± 7% 154µs ± 7% -37.08% (p=0.008 n=5+5) SetString/5000/String()-16 3.32ms ± 9% 2.21ms ± 2% -33.50% (p=0.008 n=5+5) name old alloc/op new alloc/op delta ObjectString/5/String()-16 528B ± 0% 280B ± 0% -46.97% (p=0.008 n=5+5) ObjectString/50/String()-16 4.99kB ± 0% 2.26kB ± 0% -54.60% (p=0.008 n=5+5) ObjectString/500/String()-16 48.8kB ± 0% 41.8kB ± 0% -14.42% (p=0.029 n=4+4) ObjectString/5000/String()-16 700kB ± 0% 409kB ± 0% -41.52% (p=0.008 n=5+5) ArrayString/5/String()-16 376B ± 0% 144B ± 0% -61.70% (p=0.008 n=5+5) ArrayString/50/String()-16 3.44kB ± 0% 1.82kB ± 0% -46.98% (p=0.008 n=5+5) ArrayString/500/String()-16 34.5kB ± 0% 25.8kB ± 0% -25.20% (p=0.008 n=5+5) ArrayString/5000/String()-16 520kB ± 0% 241kB ± 0% -53.69% (p=0.029 n=4+4) SetString/5/String()-16 376B ± 0% 128B ± 0% -65.96% (p=0.008 n=5+5) SetString/50/String()-16 2.97kB ± 0% 0.98kB ± 0% -67.13% (p=0.008 n=5+5) SetString/500/String()-16 27.4kB ± 0% 14.6kB ± 0% -46.52% (p=0.008 n=5+5) SetString/5000/String()-16 477kB ± 0% 195kB ± 0% -59.18% (p=0.016 n=5+4) name old allocs/op new allocs/op delta ObjectString/5/String()-16 28.0 ± 0% 21.0 ± 0% -25.00% (p=0.008 n=5+5) ObjectString/50/String()-16 211 ± 0% 159 ± 0% -24.64% (p=0.008 n=5+5) ObjectString/500/String()-16 2.01k ± 0% 1.52k ± 0% -24.68% (p=0.008 n=5+5) ObjectString/5000/String()-16 16.0k ± 0% 11.0k ± 0% ~ (p=0.079 n=4+5) ArrayString/5/String()-16 21.0 ± 0% 18.0 ± 0% -14.29% (p=0.008 n=5+5) ArrayString/50/String()-16 159 ± 0% 157 ± 0% -1.26% (p=0.008 n=5+5) ArrayString/500/String()-16 1.51k ± 0% 1.51k ± 0% +0.07% (p=0.008 n=5+5) ArrayString/5000/String()-16 11.0k ± 0% 11.0k ± 0% +0.02% (p=0.008 n=5+5) SetString/5/String()-16 9.00 ± 0% 5.00 ± 0% -44.44% (p=0.008 n=5+5) SetString/50/String()-16 52.0 ± 0% 9.0 ± 0% -82.69% (p=0.008 n=5+5) SetString/500/String()-16 505 ± 0% 15 ± 0% -97.03% (p=0.008 n=5+5) SetString/5000/String()-16 5.01k ± 0% 0.02k ± 0% -99.52% (p=0.008 n=5+5) Signed-off-by: Stephan Renatus <stephan.renatus@gmail.com>
S
Stephan Renatus committed
5e9a745cc9eab3a5b322114f529c656f18cb6f20
Parent: 39ba2da
Committed by GitHub <noreply@github.com>
on 8/23/2021, 4:00:52 PM