skip unnecessary alias-check in collect(::AbstractArray)
from copyto!
#55748
+10
−3
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.
As discussed on Slack with @MasonProtter & @jakobnissen,
collect
currently does a usually cheap - but sometimes expensive - aliasing check (viaunalias
->mightalias
->dataid
->objectid
) before copying contents over; this check is unnecessary, however, since the source array is newly created and cannot possibly alias the input.This PR fixes that by swapping from
copyto!
tocopyto_unaliased!
in the_collect_indices
implementations where the swap is straightforward (e.g., it is not so straightforward for the fallback_collect_indices(indsA, A)
, so I skipped it there).This improves the following example substantially:
Relatedly, it seems the fact that
mightalias
is comparing immutable contents as well - and hence slowing down theunalias
check for the aboveGarbageVector
via a slowobjectid
on tuples - is suboptimal. I don't know how to fix that though, so I'd like to leave that outside this PR. (Probably related to #26237)