The bug
When there are large numbers of ticking block entities a lot of time is spent calling the class.getSimpleName()
for the profiler, even though the profiler is not active.
Steps to reproduce
Create a new superflat world and
/tp 0 ~ 0
Create a lot of ticking block entities:
/fill 0 ~ 0 100 ~2 100 minecraft:furnace
Sampling results looks like this:
[media]Code analysis (using MCP names)
In World.java
there is a profiler section around each Block Entity's update
call.
this.theProfiler.startSection(tileentity.getClass().getSimpleName());
((ITickable)tileentity).update();
this.theProfiler.endSection();
Internally, profiler code is wrapped in if (this.profilingEnabled)
statements, but this call to getSimpleName()
is not, and it can have an impact.
See also: SPIGOT-1900, https://redd.it/5mcupg, and comments on this PR (requires spigot CLA).
The simple name of the class is pretty useless for the profiler under unremapped namings; you get things like this:
So it's a high performance cost for basically no gain. Also, that
unspecified
block is basically entirely the call togetSimpleName
- even the vanilla profiler shows the problem.My recommendation is to switch out from using the class' name to using either the name of the block (which is doable with the existing
getBlockType()
method) or using the block entity's name (which would need to have caching added, as currently that isn't stored anywhere and to retrieve it a lookup on the class must be performed).