perf(build): incremental editable installs — skip artifact cleanup and add up-to-date checks#17202
perf(build): incremental editable installs — skip artifact cleanup and add up-to-date checks#17202taegyunkim wants to merge 4 commits intomainfrom
Conversation
…d add up-to-date checks `LibraryDownloader.run()` called `remove_artifacts()` on every editable install, deleting all `.so` files and forcing full rebuilds of Rust, libdd_wrapper, and Cython extensions even when nothing changed. - Skip `remove_artifacts()` for editable installs - Detect `IS_EDITABLE` early in `CustomBuildExt.run()` so outputs resolve to the source tree instead of pip's throwaway temp dir - Use persistent `.cmake_cache/` build dir for libdd_wrapper (editable only) to reuse CMake incremental state across invocations (~10 s ThinLTO relink avoided) - Add mtime incremental checks for Cython/C extensions - Exclude `.pyx`/`.pxd` from `CMakeExtension.get_sources()` to avoid false positives Result: steady-state `pip install --no-build-isolation -e .` drops from >20 s to ~5 s. CI `build_base_venvs` jobs benefit when ext_cache is warm. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Codeowners resolved as |
Performance SLOsComparing candidate taegyunkim/riot-build-time (e6c0f77) with baseline main (97d4f14) 📈 Performance Regressions (2 suites)📈 iastaspects - 118/118✅ add_aspectTime: ✅ 104.583µs (SLO: <130.000µs 📉 -19.6%) vs baseline: +3.8% Memory: ✅ 44.015MB (SLO: <46.000MB -4.3%) vs baseline: +5.1% ✅ add_inplace_aspectTime: ✅ 101.819µs (SLO: <130.000µs 📉 -21.7%) vs baseline: ~same Memory: ✅ 44.133MB (SLO: <46.000MB -4.1%) vs baseline: +5.4% ✅ add_inplace_noaspectTime: ✅ 28.102µs (SLO: <40.000µs 📉 -29.7%) vs baseline: -0.6% Memory: ✅ 44.112MB (SLO: <46.000MB -4.1%) vs baseline: +5.4% ✅ add_noaspectTime: ✅ 48.844µs (SLO: <70.000µs 📉 -30.2%) vs baseline: -0.2% Memory: ✅ 44.052MB (SLO: <46.000MB -4.2%) vs baseline: +5.6% ✅ bytearray_aspectTime: ✅ 251.589µs (SLO: <400.000µs 📉 -37.1%) vs baseline: -0.4% Memory: ✅ 43.880MB (SLO: <46.000MB -4.6%) vs baseline: +4.8% ✅ bytearray_extend_aspectTime: ✅ 652.523µs (SLO: <800.000µs 📉 -18.4%) vs baseline: -1.6% Memory: ✅ 43.950MB (SLO: <46.000MB -4.5%) vs baseline: +5.3% ✅ bytearray_extend_noaspectTime: ✅ 266.461µs (SLO: <400.000µs 📉 -33.4%) vs baseline: +0.7% Memory: ✅ 43.910MB (SLO: <46.000MB -4.5%) vs baseline: +5.2% ✅ bytearray_noaspectTime: ✅ 138.699µs (SLO: <300.000µs 📉 -53.8%) vs baseline: -1.0% Memory: ✅ 44.064MB (SLO: <46.000MB -4.2%) vs baseline: +5.3% ✅ bytes_aspectTime: ✅ 219.201µs (SLO: <300.000µs 📉 -26.9%) vs baseline: +0.3% Memory: ✅ 43.999MB (SLO: <46.000MB -4.3%) vs baseline: +5.3% ✅ bytes_noaspectTime: ✅ 133.926µs (SLO: <200.000µs 📉 -33.0%) vs baseline: +1.3% Memory: ✅ 44.089MB (SLO: <46.000MB -4.2%) vs baseline: +5.1% ✅ bytesio_aspectTime: ✅ 3.762ms (SLO: <5.000ms 📉 -24.8%) vs baseline: -0.4% Memory: ✅ 44.022MB (SLO: <46.000MB -4.3%) vs baseline: +5.2% ✅ bytesio_noaspectTime: ✅ 315.895µs (SLO: <420.000µs 📉 -24.8%) vs baseline: ~same Memory: ✅ 44.191MB (SLO: <46.000MB -3.9%) vs baseline: +5.9% ✅ capitalize_aspectTime: ✅ 88.589µs (SLO: <300.000µs 📉 -70.5%) vs baseline: +0.5% Memory: ✅ 44.038MB (SLO: <46.000MB -4.3%) vs baseline: +5.1% ✅ capitalize_noaspectTime: ✅ 246.461µs (SLO: <300.000µs 📉 -17.8%) vs baseline: +1.2% Memory: ✅ 43.974MB (SLO: <46.000MB -4.4%) vs baseline: +4.8% ✅ casefold_aspectTime: ✅ 88.483µs (SLO: <500.000µs 📉 -82.3%) vs baseline: +0.8% Memory: ✅ 44.030MB (SLO: <46.000MB -4.3%) vs baseline: +5.3% ✅ casefold_noaspectTime: ✅ 302.988µs (SLO: <500.000µs 📉 -39.4%) vs baseline: -0.3% Memory: ✅ 43.879MB (SLO: <46.000MB -4.6%) vs baseline: +4.8% ✅ decode_aspectTime: ✅ 86.985µs (SLO: <100.000µs 📉 -13.0%) vs baseline: ~same Memory: ✅ 43.930MB (SLO: <46.000MB -4.5%) vs baseline: +5.2% ✅ decode_noaspectTime: ✅ 155.611µs (SLO: <210.000µs 📉 -25.9%) vs baseline: +0.9% Memory: ✅ 43.982MB (SLO: <46.000MB -4.4%) vs baseline: +4.8% ✅ encode_aspectTime: ✅ 84.514µs (SLO: <200.000µs 📉 -57.7%) vs baseline: +0.3% Memory: ✅ 43.827MB (SLO: <46.000MB -4.7%) vs baseline: +4.9% ✅ encode_noaspectTime: ✅ 141.803µs (SLO: <200.000µs 📉 -29.1%) vs baseline: +0.6% Memory: ✅ 43.919MB (SLO: <46.000MB -4.5%) vs baseline: +4.7% ✅ format_aspectTime: ✅ 14.640ms (SLO: <19.200ms 📉 -23.8%) vs baseline: +0.4% Memory: ✅ 43.900MB (SLO: <46.000MB -4.6%) vs baseline: +4.7% ✅ format_map_aspectTime: ✅ 16.423ms (SLO: <21.500ms 📉 -23.6%) vs baseline: +0.3% Memory: ✅ 44.028MB (SLO: <46.000MB -4.3%) vs baseline: +4.8% ✅ format_map_noaspectTime: ✅ 374.902µs (SLO: <500.000µs 📉 -25.0%) vs baseline: +0.4% Memory: ✅ 43.999MB (SLO: <46.000MB -4.3%) vs baseline: +5.1% ✅ format_noaspectTime: ✅ 305.214µs (SLO: <500.000µs 📉 -39.0%) vs baseline: +0.3% Memory: ✅ 44.166MB (SLO: <46.000MB -4.0%) vs baseline: +5.4% ✅ index_aspectTime: ✅ 139.208µs (SLO: <300.000µs 📉 -53.6%) vs baseline: 📈 +13.4% Memory: ✅ 44.018MB (SLO: <46.000MB -4.3%) vs baseline: +5.3% ✅ index_noaspectTime: ✅ 40.636µs (SLO: <300.000µs 📉 -86.5%) vs baseline: +0.7% Memory: ✅ 44.111MB (SLO: <46.000MB -4.1%) vs baseline: +5.4% ✅ join_aspectTime: ✅ 209.999µs (SLO: <300.000µs 📉 -30.0%) vs baseline: -0.3% Memory: ✅ 43.995MB (SLO: <46.000MB -4.4%) vs baseline: +5.2% ✅ join_noaspectTime: ✅ 142.458µs (SLO: <300.000µs 📉 -52.5%) vs baseline: -1.9% Memory: ✅ 44.066MB (SLO: <46.000MB -4.2%) vs baseline: +5.6% ✅ ljust_aspectTime: ✅ 505.425µs (SLO: <700.000µs 📉 -27.8%) vs baseline: -0.4% Memory: ✅ 43.974MB (SLO: <46.000MB -4.4%) vs baseline: +5.0% ✅ ljust_noaspectTime: ✅ 268.719µs (SLO: <300.000µs 📉 -10.4%) vs baseline: +5.6% Memory: ✅ 44.086MB (SLO: <46.000MB -4.2%) vs baseline: +5.2% ✅ lower_aspectTime: ✅ 299.989µs (SLO: <500.000µs 📉 -40.0%) vs baseline: +1.5% Memory: ✅ 44.043MB (SLO: <46.000MB -4.3%) vs baseline: +5.6% ✅ lower_noaspectTime: ✅ 232.470µs (SLO: <300.000µs 📉 -22.5%) vs baseline: -0.5% Memory: ✅ 43.993MB (SLO: <46.000MB -4.4%) vs baseline: +4.9% ✅ lstrip_aspectTime: ✅ 0.278ms (SLO: <3.000ms 📉 -90.7%) vs baseline: +0.7% Memory: ✅ 43.892MB (SLO: <46.000MB -4.6%) vs baseline: +4.8% ✅ lstrip_noaspectTime: ✅ 0.176ms (SLO: <3.000ms 📉 -94.1%) vs baseline: +0.2% Memory: ✅ 44.018MB (SLO: <46.000MB -4.3%) vs baseline: +4.9% ✅ modulo_aspectTime: ✅ 14.300ms (SLO: <18.750ms 📉 -23.7%) vs baseline: +0.5% Memory: ✅ 44.003MB (SLO: <46.000MB -4.3%) vs baseline: +4.9% ✅ modulo_aspect_for_bytearray_bytearrayTime: ✅ 14.858ms (SLO: <19.350ms 📉 -23.2%) vs baseline: +0.3% Memory: ✅ 44.345MB (SLO: <46.000MB -3.6%) vs baseline: +5.4% ✅ modulo_aspect_for_bytesTime: ✅ 14.362ms (SLO: <18.900ms 📉 -24.0%) vs baseline: +0.2% Memory: ✅ 44.111MB (SLO: <46.000MB -4.1%) vs baseline: +4.9% ✅ modulo_aspect_for_bytes_bytearrayTime: ✅ 14.627ms (SLO: <19.150ms 📉 -23.6%) vs baseline: -0.3% Memory: ✅ 44.290MB (SLO: <46.000MB -3.7%) vs baseline: +5.4% ✅ modulo_noaspectTime: ✅ 0.356ms (SLO: <3.000ms 📉 -88.1%) vs baseline: -0.5% Memory: ✅ 43.986MB (SLO: <46.000MB -4.4%) vs baseline: +5.3% ✅ replace_aspectTime: ✅ 18.372ms (SLO: <24.000ms 📉 -23.4%) vs baseline: ~same Memory: ✅ 44.210MB (SLO: <46.000MB -3.9%) vs baseline: +5.3% ✅ replace_noaspectTime: ✅ 283.140µs (SLO: <400.000µs 📉 -29.2%) vs baseline: +0.5% Memory: ✅ 44.045MB (SLO: <46.000MB -4.3%) vs baseline: +5.2% ✅ repr_aspectTime: ✅ 320.043µs (SLO: <420.000µs 📉 -23.8%) vs baseline: +0.1% Memory: ✅ 44.022MB (SLO: <46.000MB -4.3%) vs baseline: +5.1% ✅ repr_noaspectTime: ✅ 46.724µs (SLO: <90.000µs 📉 -48.1%) vs baseline: -0.8% Memory: ✅ 43.940MB (SLO: <46.000MB -4.5%) vs baseline: +5.3% ✅ rstrip_aspectTime: ✅ 388.233µs (SLO: <500.000µs 📉 -22.4%) vs baseline: +0.2% Memory: ✅ 44.022MB (SLO: <46.000MB -4.3%) vs baseline: +5.5% ✅ rstrip_noaspectTime: ✅ 180.609µs (SLO: <300.000µs 📉 -39.8%) vs baseline: -0.5% Memory: ✅ 43.981MB (SLO: <46.000MB -4.4%) vs baseline: +5.2% ✅ slice_aspectTime: ✅ 185.990µs (SLO: <300.000µs 📉 -38.0%) vs baseline: ~same Memory: ✅ 44.057MB (SLO: <46.000MB -4.2%) vs baseline: +5.4% ✅ slice_noaspectTime: ✅ 54.615µs (SLO: <90.000µs 📉 -39.3%) vs baseline: -0.4% Memory: ✅ 43.998MB (SLO: <46.000MB -4.4%) vs baseline: +5.0% ✅ stringio_aspectTime: ✅ 3.801ms (SLO: <5.000ms 📉 -24.0%) vs baseline: ~same Memory: ✅ 44.043MB (SLO: <46.000MB -4.3%) vs baseline: +5.3% ✅ stringio_noaspectTime: ✅ 375.204µs (SLO: <500.000µs 📉 -25.0%) vs baseline: +8.2% Memory: ✅ 44.094MB (SLO: <46.000MB -4.1%) vs baseline: +5.3% ✅ strip_aspectTime: ✅ 277.448µs (SLO: <350.000µs 📉 -20.7%) vs baseline: +0.6% Memory: ✅ 44.150MB (SLO: <46.000MB -4.0%) vs baseline: +5.8% ✅ strip_noaspectTime: ✅ 176.083µs (SLO: <240.000µs 📉 -26.6%) vs baseline: -0.3% Memory: ✅ 43.991MB (SLO: <46.000MB -4.4%) vs baseline: +4.7% ✅ swapcase_aspectTime: ✅ 331.576µs (SLO: <500.000µs 📉 -33.7%) vs baseline: -1.0% Memory: ✅ 44.146MB (SLO: <46.000MB -4.0%) vs baseline: +5.6% ✅ swapcase_noaspectTime: ✅ 268.709µs (SLO: <400.000µs 📉 -32.8%) vs baseline: -0.2% Memory: ✅ 44.148MB (SLO: <46.000MB -4.0%) vs baseline: +5.3% ✅ title_aspectTime: ✅ 319.711µs (SLO: <500.000µs 📉 -36.1%) vs baseline: +0.2% Memory: ✅ 44.037MB (SLO: <46.000MB -4.3%) vs baseline: +5.5% ✅ title_noaspectTime: ✅ 252.909µs (SLO: <400.000µs 📉 -36.8%) vs baseline: -0.9% Memory: ✅ 43.950MB (SLO: <46.000MB -4.5%) vs baseline: +4.7% ✅ translate_aspectTime: ✅ 492.622µs (SLO: <700.000µs 📉 -29.6%) vs baseline: +0.2% Memory: ✅ 43.892MB (SLO: <46.000MB -4.6%) vs baseline: +4.9% ✅ translate_noaspectTime: ✅ 420.877µs (SLO: <500.000µs 📉 -15.8%) vs baseline: -1.5% Memory: ✅ 44.024MB (SLO: <46.000MB -4.3%) vs baseline: +5.2% ✅ upper_aspectTime: ✅ 294.995µs (SLO: <500.000µs 📉 -41.0%) vs baseline: -0.4% Memory: ✅ 44.026MB (SLO: <46.000MB -4.3%) vs baseline: +5.1% ✅ upper_noaspectTime: ✅ 229.913µs (SLO: <400.000µs 📉 -42.5%) vs baseline: -0.8% Memory: ✅ 44.052MB (SLO: <46.000MB -4.2%) vs baseline: +5.2% 📈 iastaspectsospath - 24/24✅ ospathbasename_aspectTime: ✅ 506.965µs (SLO: <700.000µs 📉 -27.6%) vs baseline: 📈 +19.0% Memory: ✅ 43.925MB (SLO: <46.000MB -4.5%) vs baseline: +5.1% ✅ ospathbasename_noaspectTime: ✅ 433.269µs (SLO: <700.000µs 📉 -38.1%) vs baseline: +1.3% Memory: ✅ 43.881MB (SLO: <46.000MB -4.6%) vs baseline: +4.8% ✅ ospathjoin_aspectTime: ✅ 626.869µs (SLO: <700.000µs 📉 -10.4%) vs baseline: +1.0% Memory: ✅ 43.839MB (SLO: <46.000MB -4.7%) vs baseline: +4.8% ✅ ospathjoin_noaspectTime: ✅ 633.945µs (SLO: <700.000µs -9.4%) vs baseline: -0.8% Memory: ✅ 43.893MB (SLO: <46.000MB -4.6%) vs baseline: +4.9% ✅ ospathnormcase_aspectTime: ✅ 348.320µs (SLO: <700.000µs 📉 -50.2%) vs baseline: -1.3% Memory: ✅ 43.972MB (SLO: <46.000MB -4.4%) vs baseline: +5.2% ✅ ospathnormcase_noaspectTime: ✅ 362.123µs (SLO: <700.000µs 📉 -48.3%) vs baseline: +0.6% Memory: ✅ 43.881MB (SLO: <46.000MB -4.6%) vs baseline: +5.0% ✅ ospathsplit_aspectTime: ✅ 481.019µs (SLO: <700.000µs 📉 -31.3%) vs baseline: -0.8% Memory: ✅ 43.859MB (SLO: <46.000MB -4.7%) vs baseline: +4.8% ✅ ospathsplit_noaspectTime: ✅ 499.373µs (SLO: <700.000µs 📉 -28.7%) vs baseline: +1.3% Memory: ✅ 43.895MB (SLO: <46.000MB -4.6%) vs baseline: +5.4% ✅ ospathsplitdrive_aspectTime: ✅ 373.152µs (SLO: <700.000µs 📉 -46.7%) vs baseline: +0.3% Memory: ✅ 43.804MB (SLO: <46.000MB -4.8%) vs baseline: +4.7% ✅ ospathsplitdrive_noaspectTime: ✅ 73.296µs (SLO: <700.000µs 📉 -89.5%) vs baseline: +0.3% Memory: ✅ 43.968MB (SLO: <46.000MB -4.4%) vs baseline: +5.2% ✅ ospathsplitext_aspectTime: ✅ 457.474µs (SLO: <700.000µs 📉 -34.6%) vs baseline: +0.1% Memory: ✅ 43.879MB (SLO: <46.000MB -4.6%) vs baseline: +4.8% ✅ ospathsplitext_noaspectTime: ✅ 464.503µs (SLO: <700.000µs 📉 -33.6%) vs baseline: +0.6% Memory: ✅ 43.744MB (SLO: <46.000MB -4.9%) vs baseline: +4.4% 🟡 Near SLO Breach (3 suites)🟡 djangosimple - 30/30✅ appsecTime: ✅ 19.604ms (SLO: <22.300ms 📉 -12.1%) vs baseline: ~same Memory: ✅ 69.330MB (SLO: <73.500MB -5.7%) vs baseline: +4.8% ✅ exception-replay-enabledTime: ✅ 1.324ms (SLO: <1.450ms -8.7%) vs baseline: -0.2% Memory: ✅ 67.546MB (SLO: <71.500MB -5.5%) vs baseline: +4.8% ✅ iastTime: ✅ 19.594ms (SLO: <22.250ms 📉 -11.9%) vs baseline: -0.3% Memory: ✅ 69.304MB (SLO: <75.000MB -7.6%) vs baseline: +4.8% ✅ profilerTime: ✅ 15.149ms (SLO: <16.550ms -8.5%) vs baseline: ~same Memory: ✅ 60.438MB (SLO: <61.000MB 🟡 -0.9%) vs baseline: +4.8% ✅ resource-renamingTime: ✅ 19.606ms (SLO: <21.750ms -9.9%) vs baseline: -0.2% Memory: ✅ 69.297MB (SLO: <73.500MB -5.7%) vs baseline: +4.9% ✅ span-code-originTime: ✅ 20.237ms (SLO: <28.200ms 📉 -28.2%) vs baseline: +1.9% Memory: ✅ 69.615MB (SLO: <75.000MB -7.2%) vs baseline: +5.0% ✅ tracerTime: ✅ 19.659ms (SLO: <21.750ms -9.6%) vs baseline: -1.0% Memory: ✅ 69.287MB (SLO: <75.000MB -7.6%) vs baseline: +4.7% ✅ tracer-and-profilerTime: ✅ 21.098ms (SLO: <23.500ms 📉 -10.2%) vs baseline: +0.1% Memory: ✅ 71.300MB (SLO: <75.000MB -4.9%) vs baseline: +4.7% ✅ tracer-dont-create-db-spansTime: ✅ 19.744ms (SLO: <21.500ms -8.2%) vs baseline: ~same Memory: ✅ 69.229MB (SLO: <75.000MB -7.7%) vs baseline: +4.7% ✅ tracer-minimalTime: ✅ 16.900ms (SLO: <17.500ms -3.4%) vs baseline: ~same Memory: ✅ 69.322MB (SLO: <75.000MB -7.6%) vs baseline: +4.8% ✅ tracer-nativeTime: ✅ 19.639ms (SLO: <21.750ms -9.7%) vs baseline: -0.5% Memory: ✅ 69.255MB (SLO: <72.500MB -4.5%) vs baseline: +4.7% ✅ tracer-no-cachesTime: ✅ 17.679ms (SLO: <19.650ms 📉 -10.0%) vs baseline: -0.1% Memory: ✅ 69.283MB (SLO: <75.000MB -7.6%) vs baseline: +4.9% ✅ tracer-no-databasesTime: ✅ 19.327ms (SLO: <20.100ms -3.8%) vs baseline: ~same Memory: ✅ 69.245MB (SLO: <75.000MB -7.7%) vs baseline: +4.7% ✅ tracer-no-middlewareTime: ✅ 19.449ms (SLO: <21.500ms -9.5%) vs baseline: +0.9% Memory: ✅ 69.240MB (SLO: <75.000MB -7.7%) vs baseline: +4.7% ✅ tracer-no-templatesTime: ✅ 19.702ms (SLO: <22.000ms 📉 -10.4%) vs baseline: +0.6% Memory: ✅ 69.251MB (SLO: <73.500MB -5.8%) vs baseline: +4.8% 🟡 flasksimple - 18/18✅ appsec-getTime: ✅ 3.372ms (SLO: <4.750ms 📉 -29.0%) vs baseline: ~same Memory: ✅ 56.433MB (SLO: <66.500MB 📉 -15.1%) vs baseline: +4.8% ✅ appsec-postTime: ✅ 2.867ms (SLO: <6.750ms 📉 -57.5%) vs baseline: ~same Memory: ✅ 56.495MB (SLO: <66.500MB 📉 -15.0%) vs baseline: +4.9% ✅ appsec-telemetryTime: ✅ 3.405ms (SLO: <4.750ms 📉 -28.3%) vs baseline: +1.5% Memory: ✅ 56.594MB (SLO: <66.500MB 📉 -14.9%) vs baseline: +5.0% ✅ debuggerTime: ✅ 1.879ms (SLO: <2.000ms -6.0%) vs baseline: ~same Memory: ✅ 49.217MB (SLO: <51.500MB -4.4%) vs baseline: +4.8% ✅ iast-getTime: ✅ 1.874ms (SLO: <2.000ms -6.3%) vs baseline: ~same Memory: ✅ 45.883MB (SLO: <49.000MB -6.4%) vs baseline: +4.7% ✅ profilerTime: ✅ 1.910ms (SLO: <2.100ms -9.0%) vs baseline: -0.6% Memory: ✅ 52.544MB (SLO: <53.500MB 🟡 -1.8%) vs baseline: +4.9% ✅ resource-renamingTime: ✅ 3.334ms (SLO: <3.650ms -8.7%) vs baseline: -0.3% Memory: ✅ 56.600MB (SLO: <60.000MB -5.7%) vs baseline: +4.9% ✅ tracerTime: ✅ 3.353ms (SLO: <3.650ms -8.1%) vs baseline: ~same Memory: ✅ 56.514MB (SLO: <60.000MB -5.8%) vs baseline: +4.9% ✅ tracer-nativeTime: ✅ 3.349ms (SLO: <3.650ms -8.2%) vs baseline: -0.1% Memory: ✅ 56.578MB (SLO: <60.000MB -5.7%) vs baseline: +4.9% 🟡 recursivecomputation - 8/8✅ deepTime: ✅ 310.827ms (SLO: <320.950ms -3.2%) vs baseline: -0.3% Memory: ✅ 37.336MB (SLO: <38.750MB -3.6%) vs baseline: +4.6% ✅ deep-profiledTime: ✅ 328.671ms (SLO: <359.150ms -8.5%) vs baseline: ~same Memory: ✅ 43.863MB (SLO: <46.000MB -4.6%) vs baseline: +5.1% ✅ mediumTime: ✅ 7.284ms (SLO: <7.400ms 🟡 -1.6%) vs baseline: -0.1% Memory: ✅ 36.707MB (SLO: <38.000MB -3.4%) vs baseline: +4.9% ✅ shallowTime: ✅ 1.012ms (SLO: <1.050ms -3.6%) vs baseline: +1.0% Memory: ✅ 36.628MB (SLO: <38.000MB -3.6%) vs baseline: +5.0%
|
… stale CMake caches setup.py: Add _purge_stale_cmake_caches() to detect and remove CMake build directories whose CMakeCache.txt was configured at a different absolute path (host macOS vs Docker Linux). Called before libdd_wrapper and FetchContent cmake builds so switching environments doesn't hard-fail cmake. scripts/run-tests: Phase 1 now passes -s (--skip-base-install) to riot run. riot's generate_base_venvs() was unconditionally re-invoking install_dev_pkg() on every Phase 1 call even when the base venv already had ddtrace installed (e.g. after riot generate). The -s flag skips that redundant pip install -e . while still creating the per-hash prefix directory (test deps) on first use. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Passing -s would skip install_dev_pkg() even on a fresh checkout where the base venv doesn't have ddtrace installed yet, breaking the cold-start case. Revert to always running Phase 1 without -s. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
✅ Tests 🎉 All green!❄️ No new flaky tests detected 🔗 Commit SHA: e6c0f77 | Docs | Datadog PR Page | Was this helpful? React with 👍/👎 or give us feedback! |
Description
Every `pip install -e .` called `remove_artifacts()` which deleted all `.so` files, forcing full rebuilds of Rust, libdd_wrapper, and Cython extensions even when nothing changed. This also silently defeated CI's `ext_cache` mechanism: `before_script` restores cached `.so` files before `riot generate` runs, but `remove_artifacts()` deleted them immediately, making every CI build a full recompile.
Changes:
Benchmarks
Local: warm `scripts/ddtest riot -P -v generate --python=3.14` (venv exists, nothing changed)
~3.4× faster (44 s → 13 s). Remaining 13 s is riot unconditionally invoking `pip install -e .` on every call regardless of whether anything changed — a separate riot-side issue.
CI: `build_base_venvs` job runtimes (3 pipelines on `main` today vs this PR)
~2× faster in CI (442 s → 221 s). The gap is smaller than locally because fixed overhead (artifact download, pytest collection, smoke test) is not affected by this change.
Direct `pip install --no-build-isolation -e .` (local, warm)
`>20 s → ~5 s`
Testing
Timed `riot generate` and `pip install --no-build-isolation -e .` on a warm local filesystem before/after. Draft PR to observe CI `build_base_venvs` runtimes.
Risks
Stale `.so` files from a Python version change or ABI-incompatible rebuild won't be auto-cleaned on editable installs; developers would need to run `python setup.py clean --all` manually. Non-editable installs (wheel builds, `pip install` without `-e`) are unaffected — `remove_artifacts()` still runs for those.
Additional Notes
`.cmake_cache/` is gitignored and only used for editable installs.