Conversation
Replace the O(n) Seq.tryFind scan in the bestGuess step of convTypeRef with O(1) dictionary lookups against the existing assembly-name tables (targetAssembliesTable_ for target, sourceAssembliesTable_ for source). The linear scan in the fallback loop is preserved for the rare case where an assembly simple-name is not in the table (e.g. type-forwarding across assembly boundaries). The per-type translation cache (typeTableFwd / typeTableBwd) already means each unique type is resolved at most once, so this change is most beneficial during the initial warm-up of a large type provider that references many distinct types. All 126 tests pass. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2 tasks
dsyme
approved these changes
Apr 1, 2026
github-actions Bot
added a commit
that referenced
this pull request
Apr 7, 2026
- Performance: O(1) convTypeRef assembly-name lookup (#493) - Performance: O(N) ILMethodDefs index construction; lazy caches in TargetTypeDefinition (#497) - Refactor: save-based caching for GetField/GetEvent/GetNestedType; Dictionary in ILNestedExportedTypesAndForwarders (#498) - CI: NuGet and FAKE build caching (#495) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
dsyme
pushed a commit
that referenced
this pull request
Apr 7, 2026
🤖 *This PR was created by [Repo Assist](https://github.com/fsprojects/FSharp.TypeProviders.SDK/actions/runs/24058266578).* ## Summary Bumps the version to **8.5.0** by adding an entry to `RELEASE_NOTES.md` covering all changes merged since 8.4.0: - **Performance**: O(1) assembly-name dictionary lookup in `convTypeRef` (#493) - **Performance**: Avoid O(n²) allocations in `ILMethodDefs` name-index construction; reuse lazy caches in `TargetTypeDefinition` for `GetField`/`GetPropertyImpl`/`GetEvent` (#497) - **Refactor**: `save`-based caching for `GetField`/`GetEvent`/`GetNestedType` on `ProvidedTypeDefinition`; `Dictionary` in `ILNestedExportedTypesAndForwarders` (#498) - **CI**: NuGet and FAKE build caching (#495) No code changes — RELEASE_NOTES.md only. ## Test Status ✅ 126/126 tests pass (`dotnet test tests/FSharp.TypeProviders.SDK.Tests.fsproj -c Release`). > Generated by 🌈 Repo Assist, see [workflow run](https://github.com/fsprojects/FSharp.TypeProviders.SDK/actions/runs/24058266578). [Learn more](https://github.com/githubnext/agentics/blob/main/docs/repo-assist.md). > > To install this [agentic workflow](https://github.com/githubnext/agentics/blob/7ee2b60744abf71b985bead4599640f165edcd93/workflows/repo-assist.md), run > ``` > gh aw add githubnext/agentics@7ee2b60 > ``` <!-- gh-aw-agentic-workflow: Repo Assist, engine: copilot, model: auto, id: 24058266578, workflow_id: repo-assist, run: https://github.com/fsprojects/FSharp.TypeProviders.SDK/actions/runs/24058266578 --> <!-- gh-aw-workflow-id: repo-assist --> --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
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 PR was created by Repo Assist, an automated AI assistant.
Summary
Replaces the O(n)
Seq.tryFindscan inconvTypeRef'sbestGuessstep with O(1) dictionary lookups against the existing assembly-name tables.Root Cause / Motivation
convTypeReftranslates a design-timeTypeto its target-context equivalent (or vice-versa). For a typetthat hasn't been seen before, the previous code did:This is an O(n) scan through all target/source assemblies for every unique type. With 100–200 reference assemblies and hundreds or thousands of distinct types in a large generated schema, this can add meaningful latency during TP warm-up.
ProvidedTypesContextalready maintains two name-indexedConcurrentDictionarys:targetAssembliesTable_keyed by assembly simple name (→Choice<Assembly, exn>)sourceAssembliesTable_keyed by assembly simple name (→Assembly)Fix
Use
t.Assembly.GetName().Nameas a dictionary key for O(1) look-up:The linear scan fallback (
loop) is fully preserved for the rare case where the assembly isn't in the table (e.g. type forwarding across assembly boundaries). The originalgetTargetAssemblies()/getSourceAssemblies()call is also preserved to populateasmsfor the fallback.A new
getSourceAssembliesTable()helper is added (mirrors the existinggetTargetAssembliesTable()).Trade-offs
typeTableFwd/typeTableBwd, so each unique type is resolved at most once; the benefit is most visible during initial TP warm-up with large schemas.Test Status
✅ All 126 tests pass (
dotnet test tests/FSharp.TypeProviders.SDK.Tests.fsproj -c Release)