prevent coercer from throwing unnecessary exceptions #359
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.
I was benchmarking my app, and the number 2 item on the list, for the # of objects created, was from this line: https://github.com/solnic/virtus/blob/master/lib/virtus/attribute/coercer.rb#L33
this patch removes this from the top 20 object-creation offenders, courtesy of the
stackprof
output.It is a similar story for CPU profiling:
after this patch, the
Coercible::Coercer::Object#raise_unsupported_coercion
no longer shows up, for a rough savings of 4.7%, but then the number of calls toVirtus::Attribute::Coercer#call
andCoercible::Coercer#[]
is also slashed.For my specific code, I also noticed a 22% performance improvement from this one change (granted, the app I'm using this in is in a tight loop, but still... wow!)
The usual caveat of microbenchmarks applies, plus I'm using
stackprof
, which does sampling, so every result is slightly different. But I think you'll agree this is a simple change with a lot of upside. I wish all performance patches were this 'easy'