[Map] Improve backend performance when rendering HTML "view" attribute #2178
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
My intuition was right, I knew there was some back optimization to be done on Map :)
For the context, I've created a Map with 1000 Marker and InfoWindow (it represents the first 1000 cities from France in alphabetical order, but it can also be a store-locator, etc...)

The code looks like:
Before
Before this PR, when profiling the page with Blackfire, we can see that

StimulusAttributes#toString()
takes ~62% of the response time (~222ms), because of the Twig escaping code (preg_replace_callback
andord()
):This is long because our
view
attribute can be very big, it contains a lot of data. But, since it's an array with a known structure, etc..., maybe we can... not use Twig escaping strategy?EDIT: opened twigphp/Twig#4322
Now
I've removed
view' => $map->toArray()
from theStimulusAttributes
, and added'data-symfony--ux-'.$this->getName().'-map--map-view-value="'.htmlentities(json_encode($map->toArray(), flags: JSON_THROW_ON_ERROR)).'"'
at the final rendering place.When profiling the page with Blackfire, I can see an improvment of ~63% on the response time 🚀 :

I'm not 100% sure, but I believe

htmlentities
andjson_encode
are enough for our usecase? I mean, it still works, and HTML in InfoWindow still works too: