perf(packages/codegen): pass `start` and `end` to `write` and `mark` functions (#25986)
Optimization to sourcemap builds. This is what the rest of this stack has been working towards. All the `writeWithMap*` and `markMap*` functions received a `node` param which they're extract `start` and `end` from. The problem is that these functions receive a range of different node types, so accessing `node.start` / `node.end` are megamorphic, involving an expensive dispatch. Instead, extract `start` and `end` at call sites, where the type of `node` is already known (monomorphic), and pass them in to `writeWithMap*` / `markMap*` functions. These functions still keep their `node` param, as it's needed for debug asserts, but it's never touched in release builds. #25989 removes it entirely from release builds too. This has quite a large effect on perf. The cumulative perf gain of this stack (#25968 onwards) in the "without generation" sourcemaps benchmark is: <table> <tr> <th align="left">Fixture</th> <th align="right">Bytes</th> <th align="right">Before</th> <th align="right">After</th> <th align="right">Faster by</th> </tr> <tr> <td align="left"> `RadixUIAdoptionSection.jsx` </td> <td align="right">2,518</td> <td align="right">0.0077 ms</td> <td align="right">0.0059 ms</td> <td align="right">+31.5%</td> </tr> <tr> <td align="left"> `react.development.js` </td> <td align="right">72,141</td> <td align="right">0.2549 ms</td> <td align="right">0.2015 ms</td> <td align="right">+26.9%</td> </tr> <tr> <td align="left"> `lodash.js` </td> <td align="right">544,096</td> <td align="right">1.14 ms</td> <td align="right">0.9289 ms</td> <td align="right">+23.5%</td> </tr> <tr> <td align="left"> `App.tsx` </td> <td align="right">415,340</td> <td align="right">1.84 ms</td> <td align="right">1.51 ms</td> <td align="right">+21.2%</td> </tr> <tr> <td align="left"> `binder.ts` </td> <td align="right">193,077</td> <td align="right">0.6598 ms</td> <td align="right">0.5483 ms</td> <td align="right">+20.6%</td> </tr> <tr> <td align="left"> `kitchen-sink.tsx` </td> <td align="right">732,222</td> <td align="right">5.12 ms</td> <td align="right">4.33 ms</td> <td align="right">+17.7%</td> </tr> <tr> <td align="left"> `antd.js` </td> <td align="right">6,683,633</td> <td align="right">23.52 ms</td> <td align="right">20.30 ms</td> <td align="right">+15.7%</td> </tr> <tr> <td></td> <td></td> <td></td> <td></td> <td></td> </tr> </table> The vast majority of that gain is down to this PR, and the ones preceding it which also remove polymorphic/megamorphic accesses. --- Note: Actually this change is unnecessary for `writeWithMapNamed`, `writeWithMapNamedPrivate`, and `writeWithMapNamedJSXNoLast` - they only receive a single type of node so are already monomorphic. But it's easier to be consistent, and this uniformity enables the further optimization in #25989. We could pare this back in a later PR, so we only pass in `start` and `end` where it's beneficial to do so.
O
overlookmotel committed
29a774930a1bda5b1ccdcf809a9f804eb61d352a
Parent: 5163b14