Daily Perf Improver: Fix memory leak in append operations (Issue #35) #193
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.
Summary
This PR fixes the critical memory leak in
AsyncSeq.appendoperations identified in Issue #35. The original implementation created generator chains that prevented garbage collection, causing O(n) memory usage instead of O(1) for streaming operations.Performance Improvements
🚀 Major memory leak eliminated:
📊 Benchmark Results:
Technical Implementation
Root Cause
The original
AsyncGenerator.appendimplementation created continuation chains usingbindGthat prevented garbage collection of intermediate generators.Solution
Replaced with a direct
IAsyncEnumerableimplementation that:Code Changes
AsyncSeq.appendfunction inAsyncSeq.fs:376-412append_benchmark.fsx)Validation
✅ All existing tests pass (168/168)
✅ Performance benchmarks show dramatic improvements
✅ No breaking changes - API remains identical
✅ Memory usage now O(1) instead of O(n) for streaming
Test Plan
dotnet test -c Releasedotnet fsi append_benchmark.fsxRelated Issues
Commands Used
Web Searches Performed
MCP Function Calls Used
mcp__github__search_issues: Found research issue Daily Perf Improver: Research and Plan #190mcp__github__get_issue_comments: Checked for maintainer feedbackmcp__github__search_pull_requests: Verified no conflicting PRsThis change eliminates a major performance bottleneck and memory leak that affected all append-heavy AsyncSeq operations. The implementation maintains full backward compatibility while providing significant performance and memory usage improvements.