Use dyn dispatch to reduce monomorphization bloat (~177KB savings) #516
+119
−39
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.
Summary
Add
#[inline(never)]wrapper pattern to prevent monomorphization of heavy process functions across multiple input types. The public API remains generic for ergonomics, but delegates to non-generic internal functions that use dynamic dispatch.Changes
decoder.rs: Addprocess_dyn/skip_frame_dynwith#[inline(never)]process.rs: Use&mut dyn JxlBitstreamInputcodestream_parser/mod.rs: Use&mut dyn JxlBitstreamInputbox_parser.rs: Use&mut dyn JxlBitstreamInputBinary size impact
Tested with example using 3 different input types (
&[u8],BufReader<Cursor>,BufReader<File>):Why this approach?
We evaluated 3 options:
#[inline(never)]on internal functions only → didn't work (public API still monomorphized)&mut dyn→ works but breaks API#[inline(never)]internal → works, API compatible ✓Test plan
cargo build --releasepassescargo fmtpasses