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 in best::row_internal::impl, which means each call does not slam best::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, and best::atoi that this optimization refactor uncovered, and introduces best::iter::take(), which I needed for debugging one of the bugs. It also adds the best::abridged concept for detecting whether a type is a best::abridged<T>.
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>
.