Skip to content

Optimize primitive service performance#106

Open
MikeAlhayek wants to merge 55 commits into
mainfrom
ma/optimizations
Open

Optimize primitive service performance#106
MikeAlhayek wants to merge 55 commits into
mainfrom
ma/optimizations

Conversation

@MikeAlhayek

Copy link
Copy Markdown
Member

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

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
@github-actions

Copy link
Copy Markdown

This pull request has merge conflicts. Please resolve those before requesting a review.

MikeAlhayek and others added 8 commits July 16, 2026 21:00
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant