You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Compiler eagerly imports IL type defs from unopened namespaces consisting of a single name #16166
When the compiler reads IL metadata, it reads type defs lazily, so types aren't read and kept in memory unless they are referenced somewhere or their containing namespace is imported. Instead of immediately importing types, special placeholders (ILPreTypeDef) are created.
It turns out that if a namespace consist of a single name, then this optimization isn't applied, and its types are eagerly imported. Moreover, this happens during a background builder creation, before any file in a project is analyzed.
This should affect the startup time and memory consumption of the compiler.
I've tested it on a referenced assembly with a single type T, and it depends on the T namespace:
Ns.T is imported eagerly
Ns1.Ns2.T is not imported
The following source code was used in the tests, no namespaces were imported:
moduleModulelett:T =null
Here's a screenshot of the stack trace from the test with Ns.T type:
This problem reproduces for other types, so types from namespaces like System are always imported on startup:
changed the title [-]Compiler imports IL type defs from unopened namespaces consisting of one name[/-][+]Compiler eagerly imports IL type defs from unopened namespaces consisting of a single name[/+]on Oct 24, 2023
There's another case: when a type is referenced, all other types in the same namespace are eagerly created too.
For example, Lazy is referenced during TcGlobals creation:
Activity
[-]Compiler imports IL type defs from unopened namespaces consisting of one name[/-][+]Compiler eagerly imports IL type defs from unopened namespaces consisting of a single name[/+]auduchinok commentedon Oct 24, 2023
There's another case: when a type is referenced, all other types in the same namespace are eagerly created too.
For example,
Lazyis referenced duringTcGlobalscreation:fsharp/src/Compiler/TypedTree/TcGlobals.fs
Line 381 in 74a8c45
This forces reading/creating of all other types in the
Systemnamespace:This should affect the analysis time and memory consumption of the compiler.
Don't force namespace contents when building the initial TcEnv
Don't force namespace contents when building the initial TcEnv
Don't force namespace contents when building the initial TcEnv
Don't force namespace contents when building the initial TcEnv
Don't force namespace contents when building the initial TcEnv
Don't force namespace contents when building the initial TcEnv