Speed up reflection and row operations #23
Merged
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.
Building reflection for types that have a lot of field tags is currently pretty slow. After this patch it will still be slow, but a lot of unnecessary work has been removed. In particular,
best::row::apply
is now implemented directly as a primitive inbest::row_internal::impl
, which means each call does not slambest::row::get
N times.Profiling suggests a lot of time is wasted instantiating copies of
best::tlist
; that may be a worthwhile target for optimizing down the line (either by making instantiation cheaper or reducing the number of instantiations; it looks like it's currently linear-ish but there are almost certainly avoidable quadratic instantiations lurking).Additionally, this change fixes bugs in
best::vec
,best::overflow
, andbest::atoi
that this optimization refactor uncovered, and introducesbest::iter::take()
, which I needed for debugging one of the bugs. It also adds thebest::abridged
concept for detecting whether a type is abest::abridged<T>
.