refactor(transformer): pass Rcs by value#3550
Conversation
Your org has enabled the Graphite merge queue for merging into mainAdd the label “merge” to the PR and Graphite will automatically add it to the merge queue when it’s ready to merge. Or use the label “hotfix” to add to the merge queue as a hot fix. You must have a Graphite account and log in to Graphite in order to use the merge queue. Sign up using this link. |
This stack of pull requests is managed by Graphite. Learn more about stacking. Join @overlookmotel and the rest of your teammates on |
CodSpeed Performance ReportMerging #3550 will not alter performanceComparing Summary
|
270cc78 to
3b78266
Compare
|
I think the 6% perf regression CodSpeed is reporting on one benchmark is specious - transformer runs semantic, so the noisy benchmark problem that semantic has now affects the transformer as well. Have force pushed to run the benchmarks again. |
|
Yup. Re-ran it and the regression went away. Maddening! |
Merge activity
|
`Rc<T>` is already a pointer, so passing `&Rc<T>` to functions adds unnecessary indirection (reference to a reference).
8c5a4bb to
7982b93
Compare
3b78266 to
0948124
Compare
## [0.13.4] - 2024-06-07 ### Features - 5c8e16c coverage: Second transformer build does not print typescript (#3561) (Dunqing) - 646b993 coverage/transformer: Handle @jsx option (#3553) (Dunqing) - a939ddd transformer/typescript: Remove more typescript ast nodes (#3563) (Dunqing) - e8a20f8 transformer/typescript: Remove typescript ast nodes (#3559) (Dunqing) - ee9a215 transformer/typescript: Handle namespace directive correctly (#3532) (Dunqing) ### Bug Fixes - affb2c8 codegen: Print indentation before directive (#3512) (Dunqing) - f6939cb transformer: Store `react_importer` in `Bindings` in JSX transform (#3551) (overlookmotel) - 7982b93 transformer: Correct spans for JSX transform (#3549) (overlookmotel) - c00598b transformer: JSX set `reference_id` on refs to imports (#3524) (overlookmotel) ### Performance - 37cdc13 transformer: Faster checks if JSX plugin enabled (#3577) (overlookmotel) - 9f467b8 transformer: Avoid fragment update where possible (#3535) (overlookmotel) - ac394f0 transformer: JSX parse pragma only once (#3534) (overlookmotel) ### Documentation - 1d3c0d7 span: Add doc comments to `oxc_span::Span` (#3543) (Don Isaac) ### Refactor - f2113ae transformer: Reduce cloning and referencing `Rc`s (#3576) (overlookmotel) - 0948124 transformer: Pass `Rc`s by value (#3550) (overlookmotel) - e4d74ac transformer: Remove `update_fragment` from JSX transform (#3541) (overlookmotel) - 73b7864 transformer: Combine import and usage in JSX transform (#3540) (overlookmotel) - 6978269 transformer/typescript: Replace reference collector with symbols references (#3533) (Dunqing) Co-authored-by: Boshen <[email protected]>
Same as #3550. `Rc<T>` is already a reference, so instead of passing an `&Rc<T>` to a function and then `Rc::clone()` it in the function, it's better to clone it first and pass `Rc<T>` to the function. `Rc<T>` and `&Rc<T>` are both 8 bytes, so it introduces no additional overhead to the function call, and reduces indirection. This is a very small optimization. Am only submitting these changes for purpose of code tidying - making the patterns around `Rc` consistent and optimal throughout the codebase. We should probably look if we can remove some of these `Rc`s entirely and replace them with plain `&` refs. I suspect `Rc` is not actually required in most places and we're only using it to avoid dealing with lifetimes, but it's sub-optimal as `Rc::clone` has a cost, whereas copying a `&` ref has none.

Rc<T>is already a pointer, so passing&Rc<T>to functions adds unnecessary indirection (reference to a reference).