Optimize _is_collection?
method
#590
Open
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.
Saw the
_is_collection?
helper method showing up as a hotspot in profiles for some of our larger templates.Running the
.all?
is 3.75x slower than simply doing a couple ofrespond_to?
comparisons. Comparing the two_is_collection?
method implementations directly:As a side bonus, this also prevents an additional array allocation from when
_object_respond_to?
splats the provided method symbols, which adds up for larger responses that use multiple partials.A simple benchmark to compare results through the jbuilder API itself. This is the most minimalistic way I found to exercise the condition.
So ~5% faster, although performance characteristics will depend on how often your template exercises the condition.
As an aside... I'm not sure if this is the expected behaviour or not, but jbuilder does consider a
Hash
to be a collection, which was surprising to me.If this behaviour is not deliberate, I can add an additional guard to have
_is_collection?
returnfalse
when providedHash
. It's more intuitive to haveHash
es render as objects, IMO.