Mono 5.4.0 Release Notes

These notes are for a current or upcoming PREVIEW RELEASE and might not reflect the final release.

THIS IS A DRAFT/WORK IN PROGRESS PLACEHOLDER OF THE 5.2 RELEASE NOTES

Release History

5.4.0 is unreleased

Highlights

In Depth

Runtime

JIT Job Control

The Runtime now controls concurrent method compilation. It avoid multiple threads compiling the same method at the same time and limits the number of threads simultaneously compiling.

This shows up as performance issue with applications such as Roslyn that very quickly ramp up a lot of threads.

Array element store optimization

Optimize array stores of non-final ref types.

Load scalability improvements

Move a few hot data structures in the type loader to use lock free reads. This shown up a scalability botheneck with Roslyn and Visual Studio for Mac first project load.

ValueType write barrier optimization

Optimize GC write barriers when value types are involved. This shown up as a performance issue with Roslyn.

Make jit method table resizing more scalable

The original table resizing code would count the size of the table on resize, this works fine for small programs but proved to be a problem with Visual Studio for Mac.

Reflection queries scalability improvements

Reflection queries must be cached by the runtime as two identical queries must return the same objects. It now use a lock free data structure for reads. This shown up as a performance issue during Visual Studio for Mac first project load.

Intrisificy Marshal.PtrToStruct for blitable types

This avoid boxing and unboxing an intermediary object. This results in a 30x speedup on a microbenchmark.

Revamped unaligned memory access support

As part of our work to support dotnet platform advances, proper unaligned access was missing from the mono runtime. This feature is used by the new Span type and now it works with ARM cpus.

Interpreter works in JIT restricted environments

There are a few things in the interpreter that still require machine specific trampolines that are written in assembly or managed code. We used the JIT infrastructure so far for that, but now we added plumbing to the AOT compiler so they can be pre-generated, and thus the interpreter is usable on platforms where code generation is not allowed during execution. See the interp option in the man page.

Interpreter supports ARM and ARM64

We added support for those architectures and also test them on CI.

Class Libraries

Use AppContextSwitchs from ReferenceSources, which allow all of it compat switches to be used.