Skip to content

[Repo Assist] perf: cache GetParameters/PropertyType/FieldType/EventHandlerType in target-model wrappers#513

Merged
dsyme merged 2 commits into
masterfrom
repo-assist/perf-cache-GetParameters-20260501-3f57ea6b8fa06ce7
May 1, 2026
Merged

[Repo Assist] perf: cache GetParameters/PropertyType/FieldType/EventHandlerType in target-model wrappers#513
dsyme merged 2 commits into
masterfrom
repo-assist/perf-cache-GetParameters-20260501-3f57ea6b8fa06ce7

Conversation

@github-actions
Copy link
Copy Markdown
Contributor

@github-actions github-actions Bot commented May 1, 2026

🤖 This is an automated PR from Repo Assist.

Summary

Caches computed values in the target-model member wrappers (txILConstructorDef, txILMethodDef, txILPropertyDef, txILEventDef, txILFieldDef) inside TargetTypeDefinition to avoid repeated type-resolution and array allocations on every call.

What was happening

Each wrapper function creates a new XxxInfo() object expression. Before this change, several frequently-called members recomputed their results from scratch on every access:

Wrapper Member Was doing
txILConstructorDef GetParameters() Array.map (txILParameter ...) every call
txILMethodDef GetParameters() Array.map (txILParameter ...) every call
txILPropertyDef PropertyType txILType resolution every call
txILPropertyDef GetIndexParameters() Array.map (txILParameter ...) every call
txILEventDef EventHandlerType txILType resolution every call
txILFieldDef FieldType txILType resolution every call

Why this matters

TargetTypeDefinition already caches its member wrapper arrays via lazy (ctorDefs, methDefs, fieldDefs, propDefs, eventDefs). This means the same wrapper objects are reused across calls. Without result caching inside the wrappers, every access to GetParameters(), PropertyType, etc. allocates a new array and re-runs IL type resolution — which the F# compiler does repeatedly during type inference against a generative type provider's generated assembly.

Fix

Added lazy bindings before each object expression to cache the computed results:

// txILMethodDef (before)
override __.GetParameters() = inp.Parameters |> Array.map (txILParameter (gps, gps2))

// txILMethodDef (after)
let parametersCache = lazy (inp.Parameters |> Array.map (txILParameter (gps, gps2)))
// ...
override __.GetParameters() = parametersCache.Value
```

Same pattern applied to `txILConstructorDef`, `txILPropertyDef`, `txILEventDef`, and `txILFieldDef`.

Note: This is independent of and complementary to PR #509 (which optimises `Array.filter (canBindXxx)` on the bind-all path).

## Test Status

```
Passed! - Failed: 0, Passed: 157, Skipped: 0, Total: 157

All 157 tests pass.

Generated by 🌈 Repo Assist, see workflow run.

Generated by 🌈 Repo Assist, see workflow run. Learn more.

To install this agentic workflow, run

gh aw add githubnext/agentics/workflows/repo-assist.md@96b9d4c39aa22359c0b38265927eadb31dcf4e2a

…target-model wrappers

The tx* wrapper functions for TargetTypeDefinition member wrappers
(txILConstructorDef, txILMethodDef, txILPropertyDef, txILEventDef,
txILFieldDef) previously recomputed type-resolved values on every call:

- GetParameters() re-ran Array.map over txILParameter on every call
- PropertyType re-ran txILType on every call
- GetIndexParameters() re-ran Array.map over txILParameter on every call
- EventHandlerType re-ran txILType on every call
- FieldType re-ran txILType on every call

Since TargetTypeDefinition caches its member wrappers in lazy arrays
(ctorDefs, methDefs, fieldDefs, propDefs, eventDefs), the same wrapper
objects are reused across calls. Caching these derived values with lazy
eliminates redundant type-resolution and array allocation on repeated
access — which occurs frequently when the F# compiler type-checks a
generative type provider's generated assembly.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@dsyme dsyme marked this pull request as ready for review May 1, 2026 16:24
@dsyme dsyme merged commit 2505f60 into master May 1, 2026
2 checks passed
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