I have a very dynamic set of images. I am pooling them but the sprite, matrix, active state etc. are touched every frame. I think if the set of images does not change then the same gameobects should get the same data set but even then the allocations stay the same.
If I pause the game no images are touched and the allocation drops to ~9k, but even that seems high.
There are 4 canvases (3 used to render to texture) and ~50 images in the scene and not much else.
If one thing changes inside one canvas, all graphics in that canvas are rendered again.
If you separate static things from things that change often with (sub-) canvases you can increase performance. Maybe it is even a good idea to separate the changing canvases more and pack things together which also change together…
For me, I am using a Quantum Console Assets in my project, I noticed that if I log some message in the Update function, it will take 200ms on Canvas.SendWillRenderCanvases cause low fps, the reason is the log message is showing on Quantum Console, which is an UI element, just disable it.