⚡️ Speed up function extract_test_context_from_frame by 491% in PR #687 (granular-async-instrumentation)#698
Closed
codeflash-ai[bot] wants to merge 1 commit into
Conversation
…687 (`granular-async-instrumentation`) The optimization replaces expensive `Path` object creation and method calls with direct string manipulation operations, delivering a **491% speedup**. **Key optimizations:** 1. **Eliminated Path object overhead**: Replaced `Path(filename).stem.startswith("test_")` with `filename.rpartition('/')[-1].rpartition('\\')[-1].rpartition('.')[0].startswith("test_")` - avoiding Path instantiation entirely. 2. **Optimized path parts extraction**: Replaced `Path(filename).parts` with `filename.replace('\\', '/').split('/')` - using simple string operations instead of Path parsing. **Performance impact analysis:** - Original profiler shows lines 25-26 (Path operations) consumed **86.3%** of total runtime (44.7% + 41.6%) - Optimized version reduces these same operations to just **25.4%** of runtime (15% + 10.4%) - The string manipulation operations are ~6x faster per call than Path object creation **Test case benefits:** - **Large-scale tests** see the biggest gains (516% faster for 900-frame stack, 505% faster for 950-frame chain) because the Path overhead multiplies with stack depth - **Edge cases** with complex paths benefit significantly (182-206% faster for subdirectory and pytest frame tests) - **Basic tests** show minimal overhead since Path operations weren't the bottleneck in shallow stacks The optimization maintains identical behavior while eliminating the most expensive operations identified in the profiling data - Path object instantiation and method calls that occurred once per stack frame.
Contributor
|
it does like repeated work in creating the Path objects everytime is expensive. @KRRT7 why don't we create the path object at the top just once? Can you also see if that candidate was generated during the optimization attempt? |
Contributor
yep, I'm sad that codeflash didn't think of that though |
Contributor
|
applied opt upstream |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
⚡️ This pull request contains optimizations for PR #687
If you approve this dependent PR, these changes will be merged into the original PR branch
granular-async-instrumentation.📄 491% (4.91x) speedup for
extract_test_context_from_frameincodeflash/code_utils/codeflash_wrap_decorator.py⏱️ Runtime :
9.55 milliseconds→1.62 milliseconds(best of128runs)📝 Explanation and details
The optimization replaces expensive
Pathobject creation and method calls with direct string manipulation operations, delivering a 491% speedup.Key optimizations:
Eliminated Path object overhead: Replaced
Path(filename).stem.startswith("test_")withfilename.rpartition('/')[-1].rpartition('\\')[-1].rpartition('.')[0].startswith("test_")- avoiding Path instantiation entirely.Optimized path parts extraction: Replaced
Path(filename).partswithfilename.replace('\\', '/').split('/')- using simple string operations instead of Path parsing.Performance impact analysis:
Test case benefits:
The optimization maintains identical behavior while eliminating the most expensive operations identified in the profiling data - Path object instantiation and method calls that occurred once per stack frame.
✅ Correctness verification report:
🌀 Generated Regression Tests and Runtime
To edit these changes
git checkout codeflash/optimize-pr687-2025-08-29T22.23.28and push.