Follow-on from #3551
In our model transform code, we're currently heavily relying on utility.Set and friends, which has a couple of performance-related issues:
- blindly copies all maps, even when using a single-use temporary map
- relies on interfaces/type reflection, which is slower than type-specific calls
We also create a lot of maps even when they're ultimately not used due to being empty.
We should investigate extending our model transform utilities to cut down on heap allocations and unnecessary copying.
I created a quick hack branch to highlight some of the gains we can expect to achieve: https://github.com/axw/apm-server/pull/new/optimise-fields
$ benchstat /tmp/old.txt /tmp/new.txt
name old time/op new time/op delta
TransactionEventDecode-8 18.0µs ± 5% 11.0µs ±11% -39.16% (p=0.016 n=4+5)
name old alloc/op new alloc/op delta
TransactionEventDecode-8 16.8kB ± 0% 10.7kB ± 0% -36.36% (p=0.000 n=4+5)
name old allocs/op new allocs/op delta
TransactionEventDecode-8 125 ± 0% 88 ± 0% -29.60% (p=0.008 n=5+5)
Follow-on from #3551
In our model transform code, we're currently heavily relying on utility.Set and friends, which has a couple of performance-related issues:
We also create a lot of maps even when they're ultimately not used due to being empty.
We should investigate extending our model transform utilities to cut down on heap allocations and unnecessary copying.
I created a quick hack branch to highlight some of the gains we can expect to achieve: https://github.com/axw/apm-server/pull/new/optimise-fields