SIGN IN SIGN UP

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