-
Notifications
You must be signed in to change notification settings - Fork 469
chore: lazy context wrapping #15295
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
chore: lazy context wrapping #15295
Conversation
We implement a lazy context wrapping mechanism whereby the bytecode context wrapping is performed on first invocation of the function. Note that this still requires the original function to be instrumented via bytecode manipulations.
|
|
Bootstrap import analysisComparison of import times between this PR and base. SummaryThe average import time from this PR is: 222 ± 5 ms. The average import time from base is: 225 ± 5 ms. The import time difference between this PR and base is: -2.8 ± 0.2 ms. Import time breakdownThe following import paths have appeared:
|
brettlangdon
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
any way to measure the impacts of this?
we should get some figures from #15272 |
Performance SLOsComparing candidate chore/wrapping-context-wrap-lazy (809ce10) with baseline main (f7999ce) 📈 Performance Regressions (2 suites)📈 iastaspects - 118/118✅ add_aspectTime: ✅ 0.402µs (SLO: <10.000µs 📉 -96.0%) vs baseline: -0.3% Memory: ✅ 39.459MB (SLO: <41.500MB -4.9%) vs baseline: +4.8% ✅ add_inplace_aspectTime: ✅ 0.406µs (SLO: <10.000µs 📉 -95.9%) vs baseline: -1.9% Memory: ✅ 39.538MB (SLO: <41.500MB -4.7%) vs baseline: +5.0% ✅ add_inplace_noaspectTime: ✅ 0.318µs (SLO: <10.000µs 📉 -96.8%) vs baseline: -0.2% Memory: ✅ 39.558MB (SLO: <41.500MB -4.7%) vs baseline: +4.2% ✅ add_noaspectTime: ✅ 0.277µs (SLO: <10.000µs 📉 -97.2%) vs baseline: +1.6% Memory: ✅ 39.440MB (SLO: <41.500MB -5.0%) vs baseline: +4.6% ✅ bytearray_aspectTime: ✅ 1.404µs (SLO: <10.000µs 📉 -86.0%) vs baseline: +6.9% Memory: ✅ 39.381MB (SLO: <41.500MB -5.1%) vs baseline: +4.7% ✅ bytearray_extend_aspectTime: ✅ 1.537µs (SLO: <10.000µs 📉 -84.6%) vs baseline: +1.0% Memory: ✅ 39.440MB (SLO: <41.500MB -5.0%) vs baseline: +4.8% ✅ bytearray_extend_noaspectTime: ✅ 0.615µs (SLO: <10.000µs 📉 -93.8%) vs baseline: +0.3% Memory: ✅ 39.381MB (SLO: <41.500MB -5.1%) vs baseline: +4.3% ✅ bytearray_noaspectTime: ✅ 0.481µs (SLO: <10.000µs 📉 -95.2%) vs baseline: ~same Memory: ✅ 39.459MB (SLO: <41.500MB -4.9%) vs baseline: +3.9% ✅ bytes_aspectTime: ✅ 1.285µs (SLO: <10.000µs 📉 -87.2%) vs baseline: -0.8% Memory: ✅ 39.518MB (SLO: <41.500MB -4.8%) vs baseline: +4.9% ✅ bytes_noaspectTime: ✅ 0.493µs (SLO: <10.000µs 📉 -95.1%) vs baseline: ~same Memory: ✅ 39.852MB (SLO: <41.500MB -4.0%) vs baseline: +6.0% ✅ bytesio_aspectTime: ✅ 1.317µs (SLO: <10.000µs 📉 -86.8%) vs baseline: +0.5% Memory: ✅ 39.499MB (SLO: <41.500MB -4.8%) vs baseline: +5.2% ✅ bytesio_noaspectTime: ✅ 0.492µs (SLO: <10.000µs 📉 -95.1%) vs baseline: -1.5% Memory: ✅ 39.833MB (SLO: <41.500MB -4.0%) vs baseline: +5.9% ✅ capitalize_aspectTime: ✅ 0.734µs (SLO: <10.000µs 📉 -92.7%) vs baseline: -0.3% Memory: ✅ 39.479MB (SLO: <41.500MB -4.9%) vs baseline: +3.8% ✅ capitalize_noaspectTime: ✅ 0.436µs (SLO: <10.000µs 📉 -95.6%) vs baseline: +0.3% Memory: ✅ 39.518MB (SLO: <41.500MB -4.8%) vs baseline: +4.0% ✅ casefold_aspectTime: ✅ 0.740µs (SLO: <10.000µs 📉 -92.6%) vs baseline: +0.1% Memory: ✅ 39.440MB (SLO: <41.500MB -5.0%) vs baseline: +5.0% ✅ casefold_noaspectTime: ✅ 0.376µs (SLO: <10.000µs 📉 -96.2%) vs baseline: +2.4% Memory: ✅ 39.774MB (SLO: <41.500MB -4.2%) vs baseline: +5.6% ✅ decode_aspectTime: ✅ 0.721µs (SLO: <10.000µs 📉 -92.8%) vs baseline: -0.8% Memory: ✅ 39.459MB (SLO: <41.500MB -4.9%) vs baseline: +4.2% ✅ decode_noaspectTime: ✅ 0.419µs (SLO: <10.000µs 📉 -95.8%) vs baseline: -1.1% Memory: ✅ 39.951MB (SLO: <41.500MB -3.7%) vs baseline: +6.1% ✅ encode_aspectTime: ✅ 0.708µs (SLO: <10.000µs 📉 -92.9%) vs baseline: +0.6% Memory: ✅ 39.381MB (SLO: <41.500MB -5.1%) vs baseline: +4.2% ✅ encode_noaspectTime: ✅ 0.401µs (SLO: <10.000µs 📉 -96.0%) vs baseline: +0.5% Memory: ✅ 39.872MB (SLO: <41.500MB -3.9%) vs baseline: +6.2% ✅ format_aspectTime: ✅ 3.381µs (SLO: <10.000µs 📉 -66.2%) vs baseline: +0.8% Memory: ✅ 39.420MB (SLO: <41.500MB -5.0%) vs baseline: +4.8% ✅ format_map_aspectTime: ✅ 3.883µs (SLO: <10.000µs 📉 -61.2%) vs baseline: 📈 +10.8% Memory: ✅ 39.931MB (SLO: <41.500MB -3.8%) vs baseline: +6.3% ✅ format_map_noaspectTime: ✅ 0.775µs (SLO: <10.000µs 📉 -92.2%) vs baseline: -0.3% Memory: ✅ 39.341MB (SLO: <41.500MB -5.2%) vs baseline: +3.5% ✅ format_noaspectTime: ✅ 0.609µs (SLO: <10.000µs 📉 -93.9%) vs baseline: +2.5% Memory: ✅ 39.872MB (SLO: <41.500MB -3.9%) vs baseline: +6.1% ✅ index_aspectTime: ✅ 0.357µs (SLO: <10.000µs 📉 -96.4%) vs baseline: +0.2% Memory: ✅ 39.420MB (SLO: <41.500MB -5.0%) vs baseline: +4.6% ✅ index_noaspectTime: ✅ 0.281µs (SLO: <10.000µs 📉 -97.2%) vs baseline: +1.7% Memory: ✅ 39.872MB (SLO: <41.500MB -3.9%) vs baseline: +6.0% ✅ join_aspectTime: ✅ 1.405µs (SLO: <10.000µs 📉 -85.9%) vs baseline: +1.0% Memory: ✅ 39.499MB (SLO: <41.500MB -4.8%) vs baseline: +5.0% ✅ join_noaspectTime: ✅ 0.489µs (SLO: <10.000µs 📉 -95.1%) vs baseline: -0.7% Memory: ✅ 39.459MB (SLO: <41.500MB -4.9%) vs baseline: +5.0% ✅ ljust_aspectTime: ✅ 2.625µs (SLO: <20.000µs 📉 -86.9%) vs baseline: +4.5% Memory: ✅ 39.479MB (SLO: <41.500MB -4.9%) vs baseline: +4.5% ✅ ljust_noaspectTime: ✅ 0.408µs (SLO: <10.000µs 📉 -95.9%) vs baseline: +0.2% Memory: ✅ 39.833MB (SLO: <41.500MB -4.0%) vs baseline: +6.0% ✅ lower_aspectTime: ✅ 2.178µs (SLO: <10.000µs 📉 -78.2%) vs baseline: ~same Memory: ✅ 39.440MB (SLO: <41.500MB -5.0%) vs baseline: +4.9% ✅ lower_noaspectTime: ✅ 0.365µs (SLO: <10.000µs 📉 -96.3%) vs baseline: -0.7% Memory: ✅ 39.931MB (SLO: <41.500MB -3.8%) vs baseline: +6.2% ✅ lstrip_aspectTime: ✅ 2.366µs (SLO: <20.000µs 📉 -88.2%) vs baseline: +6.8% Memory: ✅ 39.420MB (SLO: <41.500MB -5.0%) vs baseline: +4.8% ✅ lstrip_noaspectTime: ✅ 0.381µs (SLO: <10.000µs 📉 -96.2%) vs baseline: -1.3% Memory: ✅ 39.931MB (SLO: <41.500MB -3.8%) vs baseline: +6.0% ✅ modulo_aspectTime: ✅ 1.036µs (SLO: <10.000µs 📉 -89.6%) vs baseline: -2.5% Memory: ✅ 39.558MB (SLO: <41.500MB -4.7%) vs baseline: +4.6% ✅ modulo_aspect_for_bytearray_bytearrayTime: ✅ 1.635µs (SLO: <10.000µs 📉 -83.7%) vs baseline: +5.8% Memory: ✅ 39.499MB (SLO: <41.500MB -4.8%) vs baseline: +5.0% ✅ modulo_aspect_for_bytesTime: ✅ 0.993µs (SLO: <10.000µs 📉 -90.1%) vs baseline: +0.3% Memory: ✅ 39.479MB (SLO: <41.500MB -4.9%) vs baseline: +4.8% ✅ modulo_aspect_for_bytes_bytearrayTime: ✅ 1.253µs (SLO: <10.000µs 📉 -87.5%) vs baseline: +0.3% Memory: ✅ 39.440MB (SLO: <41.500MB -5.0%) vs baseline: +4.7% ✅ modulo_noaspectTime: ✅ 0.639µs (SLO: <10.000µs 📉 -93.6%) vs baseline: +1.7% Memory: ✅ 39.892MB (SLO: <41.500MB -3.9%) vs baseline: +6.0% ✅ replace_aspectTime: ✅ 5.413µs (SLO: <10.000µs 📉 -45.9%) vs baseline: 📈 +11.7% Memory: ✅ 39.361MB (SLO: <41.500MB -5.2%) vs baseline: +4.5% ✅ replace_noaspectTime: ✅ 0.464µs (SLO: <10.000µs 📉 -95.4%) vs baseline: +0.9% Memory: ✅ 39.931MB (SLO: <41.500MB -3.8%) vs baseline: +5.8% ✅ repr_aspectTime: ✅ 0.906µs (SLO: <10.000µs 📉 -90.9%) vs baseline: -0.5% Memory: ✅ 39.499MB (SLO: <41.500MB -4.8%) vs baseline: +5.1% ✅ repr_noaspectTime: ✅ 0.409µs (SLO: <10.000µs 📉 -95.9%) vs baseline: -1.3% Memory: ✅ 39.440MB (SLO: <41.500MB -5.0%) vs baseline: +4.7% ✅ rstrip_aspectTime: ✅ 1.903µs (SLO: <20.000µs 📉 -90.5%) vs baseline: +1.9% Memory: ✅ 39.440MB (SLO: <41.500MB -5.0%) vs baseline: +4.6% ✅ rstrip_noaspectTime: ✅ 0.380µs (SLO: <10.000µs 📉 -96.2%) vs baseline: +0.6% Memory: ✅ 39.951MB (SLO: <41.500MB -3.7%) vs baseline: +6.1% ✅ slice_aspectTime: ✅ 0.492µs (SLO: <10.000µs 📉 -95.1%) vs baseline: +0.3% Memory: ✅ 39.459MB (SLO: <41.500MB -4.9%) vs baseline: +4.8% ✅ slice_noaspectTime: ✅ 0.448µs (SLO: <10.000µs 📉 -95.5%) vs baseline: -1.7% Memory: ✅ 39.852MB (SLO: <41.500MB -4.0%) vs baseline: +5.7% ✅ stringio_aspectTime: ✅ 1.588µs (SLO: <10.000µs 📉 -84.1%) vs baseline: +3.8% Memory: ✅ 39.400MB (SLO: <41.500MB -5.1%) vs baseline: +4.8% ✅ stringio_noaspectTime: ✅ 0.723µs (SLO: <10.000µs 📉 -92.8%) vs baseline: +0.9% Memory: ✅ 39.892MB (SLO: <41.500MB -3.9%) vs baseline: +6.3% ✅ strip_aspectTime: ✅ 2.520µs (SLO: <20.000µs 📉 -87.4%) vs baseline: 📈 +14.4% Memory: ✅ 39.518MB (SLO: <41.500MB -4.8%) vs baseline: +4.9% ✅ strip_noaspectTime: ✅ 0.388µs (SLO: <10.000µs 📉 -96.1%) vs baseline: +1.2% Memory: ✅ 39.892MB (SLO: <41.500MB -3.9%) vs baseline: +6.0% ✅ swapcase_aspectTime: ✅ 2.483µs (SLO: <10.000µs 📉 -75.2%) vs baseline: +4.0% Memory: ✅ 39.577MB (SLO: <41.500MB -4.6%) vs baseline: +5.3% ✅ swapcase_noaspectTime: ✅ 0.533µs (SLO: <10.000µs 📉 -94.7%) vs baseline: -0.1% Memory: ✅ 39.892MB (SLO: <41.500MB -3.9%) vs baseline: +6.1% ✅ title_aspectTime: ✅ 2.320µs (SLO: <10.000µs 📉 -76.8%) vs baseline: +0.2% Memory: ✅ 39.459MB (SLO: <41.500MB -4.9%) vs baseline: +4.8% ✅ title_noaspectTime: ✅ 0.497µs (SLO: <10.000µs 📉 -95.0%) vs baseline: -0.2% Memory: ✅ 39.872MB (SLO: <41.500MB -3.9%) vs baseline: +5.7% ✅ translate_aspectTime: ✅ 3.197µs (SLO: <10.000µs 📉 -68.0%) vs baseline: -0.6% Memory: ✅ 39.479MB (SLO: <41.500MB -4.9%) vs baseline: +5.1% ✅ translate_noaspectTime: ✅ 1.042µs (SLO: <10.000µs 📉 -89.6%) vs baseline: +0.5% Memory: ✅ 39.440MB (SLO: <41.500MB -5.0%) vs baseline: +3.9% ✅ upper_aspectTime: ✅ 2.315µs (SLO: <10.000µs 📉 -76.9%) vs baseline: +5.4% Memory: ✅ 39.420MB (SLO: <41.500MB -5.0%) vs baseline: +4.9% ✅ upper_noaspectTime: ✅ 0.370µs (SLO: <10.000µs 📉 -96.3%) vs baseline: -1.1% Memory: ✅ 39.892MB (SLO: <41.500MB -3.9%) vs baseline: +5.9% 📈 iastaspectsospath - 24/24✅ ospathbasename_aspectTime: ✅ 4.306µs (SLO: <10.000µs 📉 -56.9%) vs baseline: -0.1% Memory: ✅ 39.774MB (SLO: <41.000MB -3.0%) vs baseline: +4.4% ✅ ospathbasename_noaspectTime: ✅ 1.081µs (SLO: <10.000µs 📉 -89.2%) vs baseline: -0.2% Memory: ✅ 39.970MB (SLO: <41.000MB -2.5%) vs baseline: +4.9% ✅ ospathjoin_aspectTime: ✅ 6.335µs (SLO: <10.000µs 📉 -36.6%) vs baseline: +3.1% Memory: ✅ 39.833MB (SLO: <41.000MB -2.8%) vs baseline: +4.7% ✅ ospathjoin_noaspectTime: ✅ 2.298µs (SLO: <10.000µs 📉 -77.0%) vs baseline: +0.8% Memory: ✅ 39.951MB (SLO: <41.000MB -2.6%) vs baseline: +5.2% ✅ ospathnormcase_aspectTime: ✅ 4.011µs (SLO: <10.000µs 📉 -59.9%) vs baseline: 📈 +14.2% Memory: ✅ 39.852MB (SLO: <41.000MB -2.8%) vs baseline: +4.7% ✅ ospathnormcase_noaspectTime: ✅ 0.566µs (SLO: <10.000µs 📉 -94.3%) vs baseline: +0.6% Memory: ✅ 39.892MB (SLO: <41.000MB -2.7%) vs baseline: +4.9% ✅ ospathsplit_aspectTime: ✅ 4.855µs (SLO: <10.000µs 📉 -51.4%) vs baseline: +0.6% Memory: ✅ 39.872MB (SLO: <41.000MB -2.8%) vs baseline: +5.0% ✅ ospathsplit_noaspectTime: ✅ 1.591µs (SLO: <10.000µs 📉 -84.1%) vs baseline: -0.1% Memory: ✅ 39.793MB (SLO: <41.000MB -2.9%) vs baseline: +4.7% ✅ ospathsplitdrive_aspectTime: ✅ 3.786µs (SLO: <10.000µs 📉 -62.1%) vs baseline: +1.3% Memory: ✅ 39.970MB (SLO: <41.000MB -2.5%) vs baseline: +5.1% ✅ ospathsplitdrive_noaspectTime: ✅ 0.702µs (SLO: <10.000µs 📉 -93.0%) vs baseline: +0.3% Memory: ✅ 39.970MB (SLO: <41.000MB -2.5%) vs baseline: +4.9% ✅ ospathsplitext_aspectTime: ✅ 4.600µs (SLO: <10.000µs 📉 -54.0%) vs baseline: -0.5% Memory: ✅ 39.892MB (SLO: <41.000MB -2.7%) vs baseline: +4.9% ✅ ospathsplitext_noaspectTime: ✅ 1.376µs (SLO: <10.000µs 📉 -86.2%) vs baseline: -0.4% Memory: ✅ 39.931MB (SLO: <41.000MB -2.6%) vs baseline: +4.9% 🟡 Near SLO Breach (2 suites)🟡 flasksimple - 18/18✅ appsec-getTime: ✅ 4.582ms (SLO: <4.750ms -3.5%) vs baseline: -0.7% Memory: ✅ 64.068MB (SLO: <66.500MB -3.7%) vs baseline: +4.8% ✅ appsec-postTime: ✅ 6.617ms (SLO: <6.750ms 🟡 -2.0%) vs baseline: -0.3% Memory: ✅ 64.388MB (SLO: <66.500MB -3.2%) vs baseline: +5.4% ✅ appsec-telemetryTime: ✅ 4.579ms (SLO: <4.750ms -3.6%) vs baseline: -0.6% Memory: ✅ 64.035MB (SLO: <66.500MB -3.7%) vs baseline: +4.9% ✅ debuggerTime: ✅ 1.855ms (SLO: <2.000ms -7.3%) vs baseline: -0.2% Memory: ✅ 47.889MB (SLO: <49.500MB -3.3%) vs baseline: +4.8% ✅ iast-getTime: ✅ 1.876ms (SLO: <2.000ms -6.2%) vs baseline: +0.4% Memory: ✅ 44.517MB (SLO: <49.000MB -9.1%) vs baseline: +5.0% ✅ profilerTime: ✅ 1.929ms (SLO: <2.100ms -8.2%) vs baseline: -0.4% Memory: ✅ 48.381MB (SLO: <50.000MB -3.2%) vs baseline: +4.1% ✅ resource-renamingTime: ✅ 3.376ms (SLO: <3.650ms -7.5%) vs baseline: +0.2% Memory: ✅ 54.404MB (SLO: <56.000MB -2.9%) vs baseline: +4.9% ✅ tracerTime: ✅ 3.357ms (SLO: <3.650ms -8.0%) vs baseline: -0.4% Memory: ✅ 54.374MB (SLO: <56.500MB -3.8%) vs baseline: +4.8% ✅ tracer-nativeTime: ✅ 3.356ms (SLO: <3.650ms -8.0%) vs baseline: -0.5% Memory: ✅ 54.321MB (SLO: <60.000MB -9.5%) vs baseline: +4.7% 🟡 telemetryaddmetric - 30/30✅ 1-count-metric-1-timesTime: ✅ 3.005µs (SLO: <20.000µs 📉 -85.0%) vs baseline: +2.6% Memory: ✅ 34.544MB (SLO: <35.500MB -2.7%) vs baseline: +4.9% ✅ 1-count-metrics-100-timesTime: ✅ 200.479µs (SLO: <220.000µs -8.9%) vs baseline: ~same Memory: ✅ 34.485MB (SLO: <35.500MB -2.9%) vs baseline: +4.6% ✅ 1-distribution-metric-1-timesTime: ✅ 3.357µs (SLO: <20.000µs 📉 -83.2%) vs baseline: +1.5% Memory: ✅ 34.465MB (SLO: <35.500MB -2.9%) vs baseline: +5.1% ✅ 1-distribution-metrics-100-timesTime: ✅ 219.019µs (SLO: <220.000µs 🟡 -0.4%) vs baseline: +0.4% Memory: ✅ 34.505MB (SLO: <35.500MB -2.8%) vs baseline: +4.9% ✅ 1-gauge-metric-1-timesTime: ✅ 2.185µs (SLO: <20.000µs 📉 -89.1%) vs baseline: +1.5% Memory: ✅ 34.544MB (SLO: <35.500MB -2.7%) vs baseline: +5.1% ✅ 1-gauge-metrics-100-timesTime: ✅ 136.237µs (SLO: <150.000µs -9.2%) vs baseline: +0.1% Memory: ✅ 34.564MB (SLO: <35.500MB -2.6%) vs baseline: +5.0% ✅ 1-rate-metric-1-timesTime: ✅ 3.099µs (SLO: <20.000µs 📉 -84.5%) vs baseline: +0.9% Memory: ✅ 34.465MB (SLO: <35.500MB -2.9%) vs baseline: +4.8% ✅ 1-rate-metrics-100-timesTime: ✅ 216.211µs (SLO: <250.000µs 📉 -13.5%) vs baseline: +1.5% Memory: ✅ 34.505MB (SLO: <35.500MB -2.8%) vs baseline: +4.9% ✅ 100-count-metrics-100-timesTime: ✅ 19.956ms (SLO: <22.000ms -9.3%) vs baseline: -0.2% Memory: ✅ 34.544MB (SLO: <35.500MB -2.7%) vs baseline: +4.8% ✅ 100-distribution-metrics-100-timesTime: ✅ 2.279ms (SLO: <2.300ms 🟡 -0.9%) vs baseline: ~same Memory: ✅ 34.603MB (SLO: <35.500MB -2.5%) vs baseline: +5.0% ✅ 100-gauge-metrics-100-timesTime: ✅ 1.411ms (SLO: <1.550ms -9.0%) vs baseline: +0.7% Memory: ✅ 34.524MB (SLO: <35.500MB -2.7%) vs baseline: +5.0% ✅ 100-rate-metrics-100-timesTime: ✅ 2.178ms (SLO: <2.550ms 📉 -14.6%) vs baseline: +0.8% Memory: ✅ 34.505MB (SLO: <35.500MB -2.8%) vs baseline: +4.7% ✅ flush-1-metricTime: ✅ 4.697µs (SLO: <20.000µs 📉 -76.5%) vs baseline: +2.1% Memory: ✅ 34.446MB (SLO: <35.500MB -3.0%) vs baseline: +4.7% ✅ flush-100-metricsTime: ✅ 173.311µs (SLO: <250.000µs 📉 -30.7%) vs baseline: -0.3% Memory: ✅ 34.485MB (SLO: <35.500MB -2.9%) vs baseline: +4.9% ✅ flush-1000-metricsTime: ✅ 2.124ms (SLO: <2.500ms 📉 -15.0%) vs baseline: +0.2% Memory: ✅ 35.291MB (SLO: <36.500MB -3.3%) vs baseline: +4.7%
|
Description
We implement a lazy context wrapping mechanism whereby the bytecode context wrapping is performed on first invocation of the function. Note that this still requires the original function to be instrumented via bytecode manipulations.
The wrapping done by the existing
WrappingContextclass performs a decompilation of the code object into an abstract bytecode representation that can be easily manipulated. The result is then recompiled into actual bytecode. The complexity is therefore roughlyO(n). With theLazyWrappingContextsolution we use the different wrapping technique of transforming the original function into a proxy for the original one that executes a wrapper. The wrapper receives the original function and the invocation arguments and is responsible for calling the original function and returning its result. TheLazyWrappingContextuses this wrapping technique to wrap the original function with a trampoline that unwraps the function and then applies theWrappingContextwrapping on the first invocation. The trampolining is a much cheaper operation because it only requires a few opcodes to be performed, essentially giving aO(1)instrumentation cost. Only when (and if) the function is invoked for the first time, the full instrumentation cost is then paid.Additional Notes
The motivation for this change is to allow for a more lightweight bytecode instrumentation to trigger a more expensive one only when needed. This is typically when an instrumented function is called for the first time.
Performance Analysis
The following table shows the instrumentation cost per normal Python function on the basis of code object size