Optimize primitive service performance#106
Open
MikeAlhayek wants to merge 55 commits into
Open
Conversation
Reduce allocations in template rendering, document processing, MCP resource merging, AI argument parsing, PostgreSQL filter translation, and template discovery. Add behavior coverage and reproducible benchmarks. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Replace repeated prompt-name scans with ordinal hash-based de-duplication while preserving source precedence and catalog behavior. Add tests and reproducible benchmarks. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Avoid materializing full document text when callers request a bounded context. Preserve stable chunk ordering, empty-content behavior, and exact truncation semantics with tests and benchmarks. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Slice unfiltered cached pages directly and avoid full filtered-list materialization while preserving extensible query filtering. Add coverage and reproducible benchmarks. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Build a per-call extraction entry index that preserves direct, normalized, and semantic precedence while eliminating repeated scans and normalization. Add behavior coverage and reproducible benchmarks. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Return already-valid tool names without allocating a replacement buffer while preserving invalid-character normalization. Add A2A registry coverage and reproducible benchmarks. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Build document ID filters without per-ID projection strings while preserving ordering, filtering, and OData escaping. Add pure helper coverage and reproducible benchmarks. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Reuse per-read row value storage while preserving sparse-cell padding, trimming, and exact tab-separated output. Add behavior coverage and reproducible benchmarks. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Reuse the shared document ID filter builder in AzureAISearchAIDataSourceSourceHandler.ReadByIdsAsync instead of a per-identifier LINQ projection joined with " or ". The emitted apostrophe-escaped OData filter text is unchanged, locked by a characterization test that compares the shared builder to the legacy projection across empty, apostrophe-heavy, ordered, and duplicate identifier sets. Building the filter once through the shared builder removes the per-id projection and interpolation strings, cutting allocations by ~54-59% across 1/10/100/1000 identifiers (deterministic across runs) with directionally faster, GC-noise-sensitive timing. Add an isolating benchmark for the changed step and expose the shared builder to the AI package via InternalsVisibleTo. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Append query result columns and cells directly into the shared ZString builder in
QueryTabularDataTool.FormatResult instead of projecting each row through
string.Join(" | ", row.Select(FormatCell)). Output stays byte-for-byte identical while
allocations drop 44-59% across every bounded result shape. The GetDocumentMetadataTool
text-absorbing column-inference candidate is documented but rejected because it yields no
allocation reduction on a once-per-call path. Covered by characterization tests and benchmarks.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
|
This pull request has merge conflicts. Please resolve those before requesting a review. |
Page query projects only summary columns plus serialized content instead of materializing both AIChatSessionRecord and DocumentRecord. Update path attaches a key-only DocumentRecord and marks only content modified, avoiding a payload-sized read. Save allocations -30.8% (64 KB) and -39.3% (1 MB). Narrow summary deserialization rejected to preserve corruption detection. Full XML benchmark evidence added to benchmarks/README.md. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Retain the bounded-ring prompt tail path after BenchmarkDotNet showed deterministic allocation reductions on sustained bounded-history cases: 10,000 dense K=2 drops from 80,832 B to 632 B, K=20 from 81,384 B to 1,720 B, and sparse K=20 from 9,384 B to 1,720 B. Timing remains noisy, so the acceptance signal is allocation-first. Characterization tests lock exact prompt text/order, role and text eligibility, duplicate/reference preservation, final-user suppression, null-history tolerance, null-element exception timing, and integer boundary behavior. Benchmark documentation records the oversized sparse K=200 regression and the rejected trailing Text caching experiment. Validation: dotnet build CrestApps.Core.slnx -c Release -p:NuGetAudit=false (0 warnings); dotnet test tests/CrestApps.Core.Tests/CrestApps.Core.Tests.csproj -c Release -p:NuGetAudit=false --no-build (2380 passed). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Share the immutable A2A proxy tool schema to avoid per-tool JSON parsing during registry materialization. Add characterization coverage and benchmark documentation for the retained allocation reduction. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Retains context-builder array dispatch because non-empty completion handlers drop from 448-1,456 B to 288 B and orchestration handlers drop from 600-1,608 B to 440 B in the validation run. Retains function tool ordering because mixed entries drop from 1,168/4,688/42,952 B to 848/3,920/38,640 B while preserving stable non-MCP-before-MCP ordering. Retains prompt risk aggregation because matched-rule inputs drop from 400/1,776/2,280/3,376/4,272 B to 80/712/1,344/2,400/3,040 B with exact characterization coverage. Build completed with 0 warnings and all 2,363 tests passed. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c
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.
Reduce allocations in template rendering, document processing, MCP resource merging, AI argument parsing, PostgreSQL filter translation, and template discovery. Add behavior coverage and reproducible benchmarks.
Co-authored-by: Copilot 223556219+Copilot@users.noreply.github.com
Copilot-Session: 8f1d3961-3004-4e83-84c5-337b9be1f85c