Optimize import substitution with zero-allocation ImportPathIter #100
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.
Optimize import substitution with zero-allocation ImportPathIter
Background
I identified significant memory allocations in the import substitution method while profiling the Bevy game engine's "many cubes" example using the DHAT memory profiler. Specifically, the
to_owned()
function was being called frequently, responsible for 2.34% of overall allocated memory blocks.Changes
This PR introduces a custom
ImportPathIter
enum (similar to Either enum crate) and refactors thesubstitute_identifiers
function to use this new iterator. The main goals were to reduce allocations and improve overall performance.Key changes include:
ImportPathIter
enum to handle different types of iterators. That helps us to avoid allocating new Vec or Box.substitute_identifiers
to useImportPathIter
, reducing allocations.contains
instead offind
for quote checks.Impact
While the memory usage of the targeted code path was relatively low (0.02% of the overall program), this optimization provides a noticeable improvement:
to_owned()
was responsible for 2.34% of overall allocated memory blocksTesting
Before
After
I ran the application again and conducted profiling. The
to_owned()
function was no longer present in the profiling results, confirming that we've successfully addressed the issue.