Skip to content

.NET 8 Per-Preview Performance report on WASM, Mono AOT, and Interpreter #84302

Description

@kotlarmilos

This report provides an overview of the major performance improvements and regressions in WASM, Mono AOT, and Interpreter during the timeframe of .NET 8 per-preview releases. It focuses on relevant improvements and regressions that are either in progress or investigating, and they are tracked separately. Reports #77490 and #79288 track active speed and size regressions respectively.

Full benchmark report will be available in form similar to #79245 and https://devblogs.microsoft.com/dotnet/performance_improvements_in_net_7/ when .NET 8 is released.

Setup

According to the https://github.com/dotnet/perf-autofiling-issues, the following configurations are used.

Operating SystemBitProcessor Name
macOS 13.0Arm64Apple M1
ubuntu 18.04X64Intel Xeon CPU E5-1650 v4 3.60GHz

More details on .NET performance benchmarking are available at https://github.com/dotnet/performance.

Preview 7

The following section presents only major improvements with high-level analysis. The analysis should be taken dubiously and readers are encouraged to examine benchmark reports for thorough analysis. We encourage readers to examine the benchmark reports and to call out major improvements not mentioned in this report.

Mono AOT compiler

The performance regressions and improvements are analyzed separately in #89238.

Mono Interpreter

The following sections presents improvements and regressions introduced in Interpreter in the Preview 7.

Improvements

Here is a list of top 20 microbenchmarks improvements in Preview 7.

NameBaseline ValueCompare Value% Difference
PerfLabTests.EnumPerf.EnumEquals646.25229.29-64.52
System.Tests.Perf_Enum.ToString_NonFlags_Small(value: TopDirectoryOnly)633.28235.90-62.74
"System.Tests.Perf_Enum.ToString_Format_Flags_Large(value: Allformat: ""g"")"667.24271.04
System.Reflection.Attributes.IsDefinedClassHitInherit1315.59562.93-57.21
System.Reflection.Activator<EmptyStruct>.CreateInstanceGeneric721.39330.82-54.14
System.Numerics.Tests.Perf_Vector4.SubtractOperatorBenchmark20.829.59-53.92
System.Reflection.Invoke.Method0_NoParms853.86399.59-53.20
System.Numerics.Tests.Perf_Matrix4x4.CreateRotationZBenchmark78.5440.02-49.03
System.Reflection.Attributes.IsDefinedMethodBaseMissInherit2512.811431.26-43.04
System.Numerics.Tests.Perf_Matrix4x4.MultiplyByScalarBenchmark183.31106.83-41.71
System.Tests.Perf_Enum.InterpolateIntoStringBuilder_Flags(value: 32)7501.154383.76-41.55
System.Numerics.Tests.Perf_Vector3.TransformNormalByMatrix4x4Benchmark189.92111.79-41.13
"System.IO.Tests.Perf_RandomAccess.ReadScatter(fileSize: 1048576buffersSize: 16384options: None)"400115.22
System.Numerics.Tests.Perf_Matrix4x4.CreateRotationXWithCenterBenchmark90.0460.34-32.98
"System.Globalization.Tests.StringSearch.IsSuffix_DifferentLastChar(Options: (en-USIgnoreCaseTrue))"1024.28
"System.Tests.Perf_Enum.StringFormat(value: RedGreen)"7002.804942.10
"System.Tests.Perf_Enum.ToString_Flags(value: RedOrangeYellowGreen
System.Numerics.Tests.Perf_VectorOf<Byte>.AddBenchmark11.288.19-27.44
System.Numerics.Tests.Perf_Vector4.DivideByScalarBenchmark30.2521.97-27.36
System.Numerics.Tests.Perf_Vector2.EqualsBenchmark35.8527.68-22.78

Vectorization of Vector4 in #87822 improved over 100 microbenchmarks in dotnet/perf-autofiling-issues#19758 and dotnet/perf-autofiling-issues#19760.

Fix path for empty partition in Enumerable.Select in #88425 improved EmptyTakeSelectToArray microbenchmarks as reported in dotnet/perf-autofiling-issues#19761.

Improved BigInteger operators +, - and * for trivial cases in #84733 improved some of BigInteger microbenchmarks in dotnet/perf-autofiling-issues#19762.

Precomputing the CallInfo structure in #88369 improved about 200 microbenchmarks.

The BCL change #86287 and vectorization of Vector128 in #88064 improved a dozen of Equals microbenchmarks.

Regressions

Here is a list of top 20 regressed microbenchmarks in Preview 7.

NameBaseline ValueCompare Value% Difference
System.Collections.CtorFromCollection<String>.FrozenDictionary(Size: 512)44266.49396363.53795.40
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Int32>.EqualsAllBenchmark6.909.5838.82
"Microsoft.Extensions.DependencyInjection.TimeToFirstService.Scoped(Mode: ""Expressions"")"49567.2565031.3531.19
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<UInt64>.BitwiseOrOperatorBenchmark9.6212.4529.41
System.Numerics.Tests.Perf_VectorOf<SByte>.OnesComplementOperatorBenchmark6.047.8029.23
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Single>.AllBitsSetBenchmark2.042.6128.32
System.Tests.Perf_GC<Byte>.NewOperator_Array(length: 10000)4495.945733.4627.52
System.Memory.Span<Char>.SequenceEqual(Size: 33)85.83108.5626.49
System.Numerics.Tests.Perf_VectorOf<Single>.AddOperatorBenchmark7.679.5824.98
"Microsoft.Extensions.DependencyInjection.TimeToFirstService.Scoped(Mode: ""ILEmit"")"49928.8862377.0124.93
System.Memory.Constructors<String>.SpanFromArray15.5919.4024.46
Microsoft.Extensions.DependencyInjection.ScopeValidation.TransientWithScopeValidation1815.082227.8522.74
System.Numerics.Tests.Perf_VectorOf<Int64>.EqualityOperatorBenchmark6.567.7718.48
System.IO.Tests.Perf_File.CopyToOverwrite(size: 4096)47118.5255507.1217.80
"System.Tests.Perf_Decimal.TryParse(value: ""123456.789"")"895.481023.9814.34
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Double>.AllBitsSetBenchmark1.481.6914.11
System.Numerics.Tests.Perf_VectorOf<UInt16>.AndNotBenchmark9.1610.4413.96
System.Memory.Span<Byte>.IndexOfValue(Size: 33)58.2065.9513.31
System.Runtime.Intrinsics.Tests.Perf_Vector128Int.BitwiseOrOperatorBenchmark7.628.6112.96
"System.Tests.Perf_Int32.ParseSpan(value: ""2147483647"")"206.91233.6912.94

Preview 6

The following section presents only major improvements with high-level analysis. The analysis should be taken dubiously and readers are encouraged to examine benchmark reports for thorough analysis. We encourage readers to examine the benchmark reports and to call out major improvements not mentioned in this report.

Mono AOT WASM

The following sections presents improvements and regressions introduced in Mono AOT WASM in the Preview 6.

Improvements

Here is a list of top 20 microbenchmarks improvements in Preview 6.

NameBaseline ValueCompare Value% Difference
System.Numerics.Tests.Perf_Quaternion.LengthBenchmark0.380.00-100
System.Numerics.Tests.Perf_Quaternion.NegationOperatorBenchmark1.870.00-100
System.Runtime.Intrinsics.Tests.Perf_Vector128Int.CountBenchmark0.340.00-100
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Int64>.CountBenchmark0.220.00-100
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<UInt16>.InequalityOperatorBenchmark0.970.00-100
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<UInt64>.CountBenchmark0.290.00-100
System.Tests.Perf_Enum.HasFlag1.350.00-100
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<UInt16>.EqualityOperatorBenchmark2.280.01<
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Int64>.CountBenchmark0.220.00-99.57
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Double>.GreaterThanAllBenchmark2.500.02-99.35
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<SByte>.UnaryNegateOperatorBenchmark85.942.58-97.00
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Byte>.UnaryNegateOperatorBenchmark85.934.27-95.02
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<SByte>.UnaryNegateOperatorBenchmark85.944.30-94.99
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Byte>.UnaryNegateOperatorBenchmark85.934.35-94.94
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Int64>.LessThanOrEqualBenchmark2.910.26-91.04
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Int16>.EqualityOperatorBenchmark2.260.25-88.80
System.Numerics.Tests.Perf_Vector3.UnitZBenchmark3.840.54-85.93
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Byte>.BitwiseAndBenchmark4.070.69-83.07
System.Runtime.Intrinsics.Tests.Perf_Vector128.FloorFloatBenchmark20.823.59-82.73
System.Net.Primitives.Tests.IPAddressPerformanceTests.TryWriteBytes(address: 1020:3040:5060:7080:9010:1112:1314:1516)78.8613.78-82.52

Regressions

Here is a list of top 20 regressed microbenchmarks in Preview 6.

NameBaseline ValueCompare Value% Difference
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Single>.CountBenchmark0.000.1426004.19
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Single>.CountBenchmark0.000.0712106.45
System.Numerics.Tests.Perf_VectorOf<Double>.CountBenchmark0.093.363767.73
System.Numerics.Tests.Perf_VectorOf<Single>.CountBenchmark0.000.062106.86
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<UInt64>.AllBitsSetBenchmark1.9510.77452.08
System.Numerics.Tests.Perf_VectorOf<Single>.CountBenchmark0.000.01405.57
System.Numerics.Tests.Perf_VectorOf<UInt16>.MaxBenchmark0.753.50365.24
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Int32>.DotBenchmark0.873.58312.42
System.Runtime.Intrinsics.Tests.Perf_Vector128Int.GreaterThanOrEqualBenchmark0.923.67300.46
System.Runtime.Intrinsics.Tests.Perf_Vector128Int.GreaterThanOrEqualBenchmark0.923.55286.90
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Double>.DotBenchmark0.782.61236.42
System.Numerics.Tests.Perf_VectorOf<SByte>.OnesComplementOperatorBenchmark0.752.51236.33
System.Numerics.Tests.Perf_VectorOf<SByte>.BitwiseOrBenchmark2.628.52225.70
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<UInt64>.ZeroBenchmark2.005.96198.55
System.Numerics.Tests.Perf_VectorOf<Int64>.ZeroBenchmark1.985.88196.21
System.Numerics.Tests.Perf_VectorOf<UInt16>.MultiplyBenchmark3.109.12194.26
System.Runtime.Intrinsics.Tests.Perf_Vector128Int.EqualsBenchmark0.982.75180.71
System.Runtime.Intrinsics.Tests.Perf_Vector128Int.EqualsBenchmark0.982.69174.16
System.Numerics.Tests.Perf_VectorOf<SByte>.UnaryNegateOperatorBenchmark1.082.80159.06
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<SByte>.MinBenchmark2.706.92156.32

Mono AOT compiler

The performance regressions and improvements are analyzed separately in #89238.

Mono Interpreter

The following sections presents improvements and regressions introduced in Mono Interpreter in the Preview 6.

Improvements

Here is a list of top 20 microbenchmarks improvements in Preview 6.

NameBaseline ValueCompare Value% Difference
System.Numerics.Tests.Perf_VectorOf<Double>.CountBenchmark0.000.00-100
System.Numerics.Tests.Perf_VectorOf<Int32>.CountBenchmark0.020.00-100
System.Numerics.Tests.Perf_VectorOf<UInt32>.CountBenchmark0.000.00-100
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Single>.CountBenchmark0.400.00-100
System.Numerics.Tests.Perf_VectorOf<SByte>.OneBenchmark76.061.57-97.93
System.Numerics.Tests.Perf_VectorOf<Byte>.OneBenchmark76.011.87-97.53
System.Numerics.Tests.Perf_VectorOf<SByte>.NegateBenchmark221.326.26-97.16
System.Numerics.Tests.Perf_VectorOf<SByte>.UnaryNegateOperatorBenchmark221.616.27-97.16
System.Numerics.Tests.Perf_VectorOf<Byte>.UnaryNegateOperatorBenchmark214.446.20-97.10
System.Numerics.Tests.Perf_VectorOf<Byte>.NegateBenchmark214.556.37-97.02
System.Numerics.Tests.Perf_VectorOf<SByte>.SubtractBenchmark231.297.90-96.58
System.Numerics.Tests.Perf_VectorOf<SByte>.SubtractionOperatorBenchmark221.047.90-96.42
System.Numerics.Tests.Perf_VectorOf<UInt16>.OneBenchmark50.921.83-96.41
System.Numerics.Tests.Perf_VectorOf<Byte>.AddBenchmark216.217.83-96.37
System.Numerics.Tests.Perf_VectorOf<Byte>.SubtractBenchmark214.797.79-96.37
System.Numerics.Tests.Perf_VectorOf<Byte>.SubtractionOperatorBenchmark215.607.92-96.32
System.Numerics.Tests.Perf_VectorOf<SByte>.MultiplyOperatorBenchmark225.868.35-96.30
System.Numerics.Tests.Perf_VectorOf<Byte>.AddOperatorBenchmark209.417.95-96.20
System.Numerics.Tests.Perf_VectorOf<SByte>.MultiplyBenchmark217.218.39-96.13
System.Numerics.Tests.Perf_VectorOf<SByte>.AddOperatorBenchmark214.448.33-96.11

Vectorization of Vector<T> operators in dotnet/perf-autofiling-issues#18537 improved over 200 microbenchmarks.

Changes in #87219 introduced Math.BigMul in NextUInt64 random method and improved several microbenchmarks reported in dotnet/perf-autofiling-issues#18690.

About 120 microbenchmarks were improved dotnet/perf-autofiling-issues#19027 potentialy by #87555 or other interpreter and BCL changes.

Fozen dictionary creation is improved by 72% in #87510.

Regressions

Here is a list of top 20 regressed microbenchmarks in Preview 6.

NameBaseline ValueCompare Value% Difference
System.Numerics.Tests.Perf_VectorOf<Int64>.CountBenchmark0.010.232775.54
System.Numerics.Tests.Perf_VectorOf<UInt64>.CountBenchmark0.010.172177.17
System.Numerics.Tests.Perf_VectorOf<UInt16>.ZeroBenchmark2.244.95121.29
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Int16>.EqualityOperatorBenchmark7.6516.63117.46
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<UInt16>.OnesComplementOperatorBenchmark3.036.11101.75
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Int64>.CountBenchmark0.040.0886.25
System.Numerics.Tests.Perf_VectorOf<UInt64>.GreaterThanAllBenchmark18.3733.1280.26
"System.Net.Http.Tests.SocketsHttpHandlerPerfTest.Get_EnumerateHeaders_Validated(ssl: True, chunkedResponse: False, responseLength: 100000)"2230622.933965252.9477.76
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Int32>.CountBenchmark0.120.2069.81
"System.Net.Http.Tests.SocketsHttpHandlerPerfTest.Get(ssl: True, chunkedResponse: False, responseLength: 100000)"2181340.943635706.6166.67
System.Numerics.Tests.Perf_VectorOf<Byte>.LessThanOrEqualAnyBenchmark18.2730.0764.56
System.Numerics.Tests.Perf_Vector4.ZeroBenchmark1.362.1055.23
HardwareIntrinsics.RayTracer.SoA.Render1.151.7652.81
System.Numerics.Tests.Perf_Vector2.DivideByScalarBenchmark13.7720.1746.46
"System.Net.Http.Tests.SocketsHttpHandlerPerfTest.Get(ssl: True, chunkedResponse: True, responseLength: 100000)"2621801.933807493.7945.22
System.Runtime.Intrinsics.Tests.Perf_Vector128.ConvertDoubleToLongBenchmark64.4889.7439.17
System.Linq.Tests.Perf_Enumerable.WhereSingleOrDefault_LastElementMatches(input: Array)2714.673708.2336.59
System.Memory.Constructors_ValueTypesOnly<Byte>.SpanFromPointerLength6.959.4736.28
Span.IndexerBench.CoveredIndex3(length: 1024)16595.2222106.9233.21
"System.Buffers.Tests.RentReturnArrayPoolTests<Object>.ProducerConsumer(RentalSize: 4096, ManipulateArray: False, Async: True, UseSharedPool: False)"867.681154.0233.00

Preview 5

There are a number of improvements introduced in Preview 5 to individually call out. The following section presents only major improvements with high-level analysis. The analysis should be taken dubiously and readers are encouraged to examine benchmark reports for thorough analysis. We encourage readers to examine the benchmark reports and to call out major improvements not mentioned in this report.

Mono AOT compiler

The performance regressions and improvements are analyzed separately in #89238.

Mono Interpreter

The following sections presents improvements and regressions introduced in Mono Interpreter in the Preview 5.

Improvements

Here is a list of top 20 microbenchmarks improvements in Preview 5.

NameBaseline ValueCompare Value% Difference
System.Numerics.Tests.Perf_VectorOf<Single>.CountBenchmark0.180.00-100
System.Numerics.Tests.Perf_VectorOf<UInt16>.CountBenchmark0.100.00-100
System.Runtime.Intrinsics.Tests.Perf_Vector128Float.CountBenchmark0.010.00-100
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Byte>.CountBenchmark0.030.00-100
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Int16>.CountBenchmark1.120.00-100
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<UInt16>.CountBenchmark0.220.00-100
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<UInt64>.CountBenchmark0.080.00-100
System.Runtime.Intrinsics.Tests.Perf_Vector128Int.CountBenchmark0.480.00-99.74
System.Numerics.Tests.Perf_VectorOf<UInt32>.CountBenchmark0.140.00-99.30
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Int32>.CountBenchmark2.360.12-95.07
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Single>.DivideBenchmark127.117.82-93.85
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Single>.MultiplyOperatorBenchmark123.897.68-93.80
System.Runtime.Intrinsics.Tests.Perf_Vector128Float.MultiplyBenchmark126.457.94-93.71
System.Runtime.Intrinsics.Tests.Perf_Vector128Float.MultiplyOperatorBenchmark125.087.87-93.70
System.Runtime.Intrinsics.Tests.Perf_Vector128Float.DivisionOperatorBenchmark123.797.83-93.67
System.Runtime.Intrinsics.Tests.Perf_Vector128Float.DivideBenchmark126.198.05-93.62
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Single>.MultiplyBenchmark127.058.23-93.52
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Single>.DivisionOperatorBenchmark123.958.22-93.37
System.Numerics.Tests.Perf_VectorOf<UInt64>.CountBenchmark0.060.01-86.49
System.Collections.Tests.Perf_Dictionary.ContainsValue(Items: 3000)483385521.5766414495.75-86.26

Vectorization of IndexOf in #85437 improved System.Text.RegularExpressions microbenchmarks reported in dotnet/perf-autofiling-issues#17517. Addition of Vector128 and PackedSimd in #82773 improved about 70 microbenchmarks reported in dotnet/perf-autofiling-issues#17563 and dotnet/perf-autofiling-issues#17819.

Change in Plane and Quaternion improved several microbenchmarks in dotnet/perf-autofiling-issues#18043.

Change in #85528 addressed performance problems with code like EqualityComparer<T>.Default.Equals() which improved over 200 microbenchmarks reported in dotnet/perf-autofiling-issues#18349. Implementation of float32 Vector128.Equals intrnsic improved System.Numerics.Tests microbenchmarks.

Regressions

Here is a list of top 20 regressed microbenchmarks in Preview 5.

NameBaseline ValueCompare Value% Difference
System.Numerics.Tests.Perf_Vector2.ZeroBenchmark0.031.053076.49
System.Numerics.Tests.Perf_VectorOf<Double>.ZeroBenchmark2.969.10207.86
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Single>.BitwiseOrOperatorBenchmark8.5121.64154.37
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<UInt32>.GreaterThanOrEqualAnyBenchmark24.2947.2394.44
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<SByte>.InequalityOperatorBenchmark3.947.1581.24
System.Numerics.Tests.Perf_Plane.CreateFromVerticesBenchmark76.92132.4072.12
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Int32>.ConditionalSelectBenchmark11.1417.4556.64
System.Buffers.Tests.RentReturnArrayPoolTests<Byte>.ProducerConsumer(RentalSize: 4096, ManipulateArray: False, Async: False, UseSharedPool: False)1877.782918.9955.44
System.Diagnostics.Perf_Process.StartAndWaitForExit1286337.511968645.1953.04
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Byte>.LessThanAllBenchmark24.2336.7851.79
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Int64>.ZeroBenchmark2.994.4749.41
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Int32>.SubtractionOperatorBenchmark7.6211.1345.99
System.Memory.Span<Char>.Reverse(Size: 512)789.891116.0041.28
System.Buffers.Tests.RentReturnArrayPoolTests<Object>.ProducerConsumer(RentalSize: 4096, ManipulateArray: False, Async: False, UseSharedPool: False)1963.382745.3839.82
System.Numerics.Tests.Perf_VectorOf<Single>.LessThanAllBenchmark59.7282.7538.57
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Double>.EqualityOperatorBenchmark27.4037.6437.35
System.Globalization.Tests.StringSearch.IndexOf_Word_NotFound(Options: (, None, False))6382.398678.9335.98
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Int64>.OnesComplementBenchmark6.388.6134.98
System.Numerics.Tests.Perf_VectorOf<Int64>.ZeroBenchmark2.813.7834.72
System.Runtime.Intrinsics.Tests.Perf_Vector128Float.LessThanOrEqualAllBenchmark26.6135.7934.51

Preview 4

There are a number of improvements introduced in Preview 4 to individually call out. The following section presents only major improvements with high-level analysis. The analysis should be taken dubiously and readers are encouraged to examine benchmark reports for thorough analysis. We encourage readers to examine the benchmark reports and to call out major improvements not mentioned in this report.

Mono AOT compiler

The following sections presents improvements and regressions introduced in Mono AOT compiler in the Preview 4.

Improvements

Here is a list of top 20 microbenchmarks improvements in Preview 4.

NameBaseline ValueCompare Value% Difference
System.Numerics.Tests.Perf_VectorOf<SByte>.CountBenchmark0.010.00-100
System.Numerics.Tests.Perf_VectorOf<UInt16>.CountBenchmark0.010.00-100
System.Numerics.Tests.Perf_VectorOf<UInt32>.CountBenchmark0.010.00-100
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Double>.CountBenchmark0.010.00-100
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Int64>.CountBenchmark0.010.00-100
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<SByte>.CountBenchmark0.010.00-100
System.Tests.Perf_DateTime.ToString(format: "s")417.41103.88-75.11
System.Tests.Perf_DateTimeOffset.ToString(format: "s")431.57114.37-73.49
System.IO.MemoryMappedFiles.Tests.Perf_MemoryMappedFile.CreateNew(capacity: 100000)25903.877803.06-69.87
System.IO.MemoryMappedFiles.Tests.Perf_MemoryMappedFile.CreateNew(capacity: 10000)25653.577923.08-69.11
System.IO.MemoryMappedFiles.Tests.Perf_MemoryMappedFile.CreateNew(capacity: 10000000)24916.247700.13-69.09
System.IO.MemoryMappedFiles.Tests.Perf_MemoryMappedFile.CreateNew(capacity: 1000000)25328.887962.83-68.56
System.Collections.Tests.Add_Remove_SteadyState<Int32>.Queue(Count: 512)18.378.31-54.78
System.Threading.Tests.Perf_Volatile.Read_double0.260.12-53.92
System.Numerics.Tests.Perf_VectorOf<Byte>.ZeroBenchmark5.662.67-52.77
System.Net.Primitives.Tests.IPAddressPerformanceTests.TryFormat(address: 1020:3040:5060:7080:9010:1112:1314:1516)243.27128.93-46.99
System.Numerics.Tests.Perf_Vector3.DistanceSquaredBenchmark16.929.15-45.90
System.Numerics.Tests.Perf_Vector3.DistanceBenchmark23.1313.70-40.79
PerfLabTests.EnumPerf.ObjectGetType0.030.02-38.31
System.Numerics.Tests.Perf_Vector3.DivideByVector3OperatorBenchmark17.4410.91-37.47

BCL changes in #84210 and #84210 improved Guid.Parse and vectorized all sets in Regex, as reported in dotnet/perf-autofiling-issues#15183 and dotnet/perf-autofiling-issues#15177.

Implementation of fast path for mini_init_method_rgctx in #84226 improved over 50 microbenchmarks reported in dotnet/perf-autofiling-issues#15717, dotnet/perf-autofiling-issues#15796, and dotnet/perf-autofiling-issues#15799.

Intrinsics get_Count and get_AllBitsSet on arm64 improved around 400 microbenchmarks, as reported in dotnet/perf-autofiling-issues#15800, dotnet/perf-autofiling-issues#15718, and dotnet/perf-autofiling-issues#15797.

Allow inlining methods containing constructor calls and Intrinsified additional calls to Type:op_Equality improved over 100 microbenchmarks reported in dotnet/perf-autofiling-issues#16371 and dotnet/perf-autofiling-issues#16509.

V128 SIMD intrinsics on Arm64 across all codegen engines in #84289 improved over 400 microbenchmarks reported in dotnet/perf-autofiling-issues#16460, dotnet/perf-autofiling-issues#16621, and dotnet/perf-autofiling-issues#16660. Adding Vector128.ConvertXX and Vector128.Create as intrinsics on arm64 improved 48 microbenchmarks reported in dotnet/perf-autofiling-issues#17314 and in dotnet/perf-autofiling-issues#17315.

Make Guid.HexsToChars aggressively inlined in #85322 improved a couple of microbenchmarks.

Regressions

Here is a list of top 20 regressed microbenchmarks in Preview 4.

NameBaseline ValueCompare Value% Difference
System.Tests.Perf_String.Substring_IntInt(s: "dzsdzsDDZSDZSDZSddsz", i1: 7, i2: 4)23.9242.3877.13
System.Buffers.Text.Tests.Utf8FormatterTests.FormatterUInt64(value: 0)14.0523.6668.37
System.Buffers.Text.Tests.Utf8FormatterTests.FormatterInt32(value: 4)13.9822.9264.00
Benchstone.BenchI.IniArray.Test186909527.87304502098.8562.91
Span.IndexerBench.Ref(length: 1024)686.541110.4261.74
System.Tests.Perf_Int64.TryParse(value: "9223372036854775807")58.1593.4060.60
System.Runtime.Intrinsics.Tests.Perf_Vector128Int.DivideBenchmark23.3037.1659.44
System.Tests.Perf_Int64.TryParse(value: "-9223372036854775808")59.0693.5858.45
System.Tests.Perf_Int64.TryParseSpan(value: "9223372036854775807")59.7193.8957.26
System.Buffers.Binary.Tests.BinaryReadAndWriteTests.MeasureReverseUsingNtoH1432.422191.5052.99
System.Tests.Perf_Int64.TryParseSpan(value: "-9223372036854775808")61.8094.1852.39
System.Threading.Tests.Perf_Volatile.Write_double0.230.3552.13
System.Numerics.Tests.Perf_VectorOf<Int32>.EqualsBenchmark0.811.2350.47
System.Tests.Perf_String.Trim(s: "Test ")76.12113.7949.48
System.Tests.Perf_UInt16.Parse(value: "12345")35.6352.7247.98
System.Tests.Perf_Int64.Parse(value: "-9223372036854775808")62.3091.7247.22
System.Tests.Perf_UInt64.Parse(value: "18446744073709551615")70.51103.2746.44
System.Tests.Perf_Int64.Parse(value: "9223372036854775807")61.6290.1746.34
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Double>.SumBenchmark2.763.9944.34
System.Collections.Tests.Perf_BitArray.BitArrayGet(Size: 512)8039.6111602.7944.32

Mono Interpreter

The following sections presents improvements and regressions introduced in Mono Interpreter in the Preview 4.

Improvements

Here is a list of top 20 microbenchmarks improvements in Preview 4.

NameBaseline ValueCompare Value% Difference
System.Numerics.Tests.Perf_VectorOf<Byte>.CountBenchmark0.000.00-100
System.Numerics.Tests.Perf_VectorOf<Int16>.CountBenchmark0.180.00-100
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Double>.CountBenchmark0.160.00-100
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Int16>.CountBenchmark1.290.00-100
System.Numerics.Tests.Perf_VectorOf<SByte>.CountBenchmark0.200.00-99.20
System.Runtime.Intrinsics.Tests.Perf_Vector128Float.CountBenchmark0.070.00-95.73
System.Tests.Perf_DateTime.ToString(format: "s")2233.23281.76-87.38
System.Text.Json.Serialization.Tests.ColdStartSerialization<SimpleStructWithProperties>.NewJsonSerializerContext185975.9828969.63-84.42
System.Tests.Perf_DateTimeOffset.ToString(format: "s")2311.74385.39-83.32
System.Numerics.Tests.Perf_VectorOf<Int32>.CountBenchmark0.440.10-77.43
System.IO.MemoryMappedFiles.Tests.Perf_MemoryMappedFile.CreateNew(capacity: 10000000)45039.5212494.67-72.25
System.IO.MemoryMappedFiles.Tests.Perf_MemoryMappedFile.CreateNew(capacity: 10000)44649.6312502.98-71.99
System.IO.MemoryMappedFiles.Tests.Perf_MemoryMappedFile.CreateNew(capacity: 1000000)45124.1513007.76-71.17
System.IO.MemoryMappedFiles.Tests.Perf_MemoryMappedFile.CreateNew(capacity: 100000)44604.3613258.02-70.27
System.Reflection.Invoke.Ctor0_NoParams393.98123.35-68.69
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Int32>.CountBenchmark0.000.00-68.38
System.Tests.Perf_DateTimeOffset.ToString(format: null)6639.432509.03-62.21
System.Reflection.Activator<EmptyClass>.CreateInstanceGeneric575.27221.73-61.45
System.Tests.Perf_DateTimeOffset.ToString(value: 12/30/2017 3:45:22 AM -08:00)6959.232746.69-60.53
System.Memory.ReadOnlySpan.Trim(input: "")49.1919.80-59.73

Implementation of IUtf8SpanFormattable in #84469 caused both improvements and regressions as reported in dotnet/perf-autofiling-issues#15630 and dotnet/perf-autofiling-issues#15626. DateTime{Offset} formatting improvement about 120 microbenchmarks reported in dotnet/perf-autofiling-issues#17009. PR #85288 improved about 30 microbenchmarks reported in dotnet/perf-autofiling-issues#17245. Handling of the Utf8Formatter.TryFormat and then delegating to the relevant helpers in #85277 improved about 30 microbenchmarks.

Regressions

Here is a list of top 20 regressed microbenchmarks in Preview 4.

NameBaseline ValueCompare Value% Difference
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Byte>.CountBenchmark0.000.239893.94
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Int64>.CountBenchmark0.020.754216.78
System.Numerics.Tests.Perf_VectorOf<UInt32>.CountBenchmark0.000.123988.20
Microsoft.Extensions.DependencyInjection.ActivatorUtilitiesBenchmark.Factory276.60852.40208.17
System.Numerics.Tests.Perf_VectorOf<UInt64>.AbsBenchmark2.324.5194.06
System.Numerics.Tests.Perf_VectorOf<UInt16>.AbsBenchmark2.374.3483.29
System.Numerics.Tests.Perf_Vector2.ZeroBenchmark0.440.7878.01
System.Memory.Constructors<Byte>.ArrayAsSpan12.2021.6377.34
Microsoft.Extensions.Primitives.Performance.StringValuesBenchmark.Indexer_FirstElement_String8.6014.8572.68
System.Net.Http.Tests.SocketsHttpHandlerPerfTest.Get(ssl: True, chunkedResponse: False, responseLength: 100000)1903905.783227992.4969.54
System.Runtime.Intrinsics.Tests.Perf_Vector128Int.OnesComplementBenchmark6.6210.8363.43
System.Buffers.Text.Tests.Utf8FormatterTests.FormatterDecimal(value: 123456.789)491.42801.0663.00
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<UInt64>.OnesComplementOperatorBenchmark6.2910.1260.75
Microsoft.AspNetCore.Server.Kestrel.Performance.PipeThroughputBenchmark.Parse_ParallelAsync(Length: 4096, Chunks: 1)8112.1012805.6157.85
System.Memory.Constructors<Byte>.MemoryMarshalCreateReadOnlySpan7.7512.1957.15
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<SByte>.CountBenchmark0.120.1954.21
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Int16>.BitwiseAndBenchmark8.4712.7350.32
System.Numerics.Tests.Constructor.ConstructorBenchmark_Int1629.4843.1746.45
System.Numerics.Tests.Perf_VectorOf<UInt16>.InequalityOperatorBenchmark19.5327.9843.23
System.Numerics.Tests.Perf_VectorOf<UInt64>.BitwiseOrBenchmark39.3955.7441.51

Preview 3

The following section overviews only major improvements with high-level analysis. The analysis should be taken dubiously and readers are encouraged to examine benchmark reports for thorough analysis. We encourage readers to examine the benchmark reports and to call out major improvements not mentioned in this report.

Mono AOT compiler

The following sections presents improvements and regressions introduced in Mono AOT compiler in the Preview 3.

Improvements

Here is a list of top 20 microbenchmarks improvements in Preview 3.

NameBaseline ValueCompare Value% Difference
System.Numerics.Tests.Perf_VectorOf<Byte>.CountBenchmark0.010.00-100
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Int32>.CountBenchmark0.010.00-100
System.Tests.Perf_Boolean.ToString(value: True)0.230.00-100
System.Numerics.Tests.Perf_Vector4.EqualityOperatorBenchmark1.960.80-59.04
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<UInt32>.SumBenchmark6.653.26-50.93
System.Numerics.Tests.Perf_Vector4.InequalityOperatorBenchmark1.390.74-46.53
System.Tests.Perf_Enum.HasFlag0.230.13-44.47
System.Numerics.Tests.Perf_BitOperations.LeadingZeroCount_uint1096.23667.83-39.07
System.Numerics.Tests.Perf_BitOperations.LeadingZeroCount_ulong1102.75746.09-32.34
System.Numerics.Tests.Perf_BitOperations.Log2_ulong1320.59895.14-32.21
System.Tests.Perf_String.IndexerCheckLengthHoisting88.8460.29-32.13
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Single>.LessThanOrEqualAllBenchmark4.443.03-31.65
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Double>.SumBenchmark4.022.76-31.25
System.Numerics.Tests.Perf_VectorOf<SByte>.MinBenchmark48.2733.34-30.93
Inlining.InlineGCStruct.WithFormat2.861.99-30.52
PerfLabTests.CastingPerf.ObjScalarValueType108762.7276497.64-29.66
System.Numerics.Tests.Perf_VectorOf<Byte>.InequalityOperatorBenchmark0.550.39-29.07
Microsoft.Extensions.Primitives.StringSegmentBenchmark.Equals_Object_Invalid2.862.04-28.66
System.Numerics.Tests.Perf_VectorOf<UInt64>.EqualityOperatorBenchmark0.520.37-28.49
System.Numerics.Tests.Perf_VectorOf<UInt64>.InequalityOperatorBenchmark0.620.45-28.32

The most improved groupings of benchmark are System.Numerics as outlined dotnet/perf-autofiling-issues#14023, dotnet/perf-autofiling-issues#14224, dotnet/perf-autofiling-issues#14573, and dotnet/perf-autofiling-issues#14322. The changes implemented in #82420, #83337, and #83094 introduced Arm64 SIMD operations and improved about 1000 microbenchmarks.

Regressions

Here is a list of top 20 regressed microbenchmarks in Preview 3.

NameBaseline ValueCompare Value% Difference
System.Numerics.Tests.Perf_VectorOf<Byte>.ZeroBenchmark2.655.66113.78
System.Numerics.Tests.Perf_BitOperations.Log2_uint791.531539.0994.44
System.Collections.Tests.Add_Remove_SteadyState<Int32>.Queue(Count: 512)9.6418.3790.64
System.Text.Json.Reader.Tests.Perf_Base64.ReadBase64EncodedByteArray_HeavyEscaping(NumberOfBytes: 1000)2769.975142.0585.63
System.Text.Json.Reader.Tests.Perf_Base64.ReadBase64EncodedByteArray_NoEscaping(NumberOfBytes: 1000)2771.035139.6285.47
System.Text.Json.Reader.Tests.Perf_Base64.ReadBase64EncodedByteArray_HeavyEscaping(NumberOfBytes: 100)377.30646.5371.35
System.Numerics.Tests.Perf_BitOperations.PopCount_uint668.421104.0465.17
System.Text.Json.Reader.Tests.Perf_Base64.ReadBase64EncodedByteArray_NoEscaping(NumberOfBytes: 100)377.61598.5358.50
System.Threading.Tests.Perf_Volatile.Read_double0.160.2657.96
System.Memory.Span<Char>.Reverse(Size: 512)258.69407.4757.51
PerfLabTests.LowLevelPerf.StructWithInterfaceInterfaceMethod154024.04239168.3455.27
System.Text.Json.Tests.Perf_Segment.ReadSingleSegmentSequenceByN(numberOfBytes: 8192, TestCase: Json4KB)13635.3520935.9753.54
System.Text.Json.Tests.Perf_Reader.ReadSpanEmptyLoop(IsDataCompact: True, TestCase: Json4KB)10415.8615732.8551.04
System.Text.Json.Tests.Perf_Reader.ReadSingleSpanSequenceEmptyLoop(IsDataCompact: True, TestCase: Json4KB)10436.1615712.2350.55
System.Numerics.Tests.Perf_VectorOf<Int32>.EqualityOperatorBenchmark0.240.3650.01
System.Collections.IndexerSetReverse.Array(Size: 512)456.86681.1349.08
System.Collections.IndexerSet<Int32>.Span(Size: 512)458.27682.2648.87
System.Numerics.Tests.Perf_VectorOf<Int64>.EqualityOperatorBenchmark0.270.4048.57
System.Numerics.Tests.Perf_BitOperations.PopCount_ulong745.131102.8448.00
System.Text.Json.Tests.Perf_Reader.ReadReturnBytes(IsDataCompact: False, TestCase: Json40KB)158074.36231420.7546.39

Mono Interpreter

The following sections presents improvements and regressions introduced in Mono Interpreter in the Preview 3.

Improvements

Here is a list of top 20 microbenchmarks improvements in Preview 3.

NameBaseline ValueCompare Value% Difference
System.Numerics.Tests.Perf_VectorOf<Single>.CountBenchmark0.160.00-100
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Single>.CountBenchmark0.010.00-100
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<UInt16>.CountBenchmark0.110.00-100
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<UInt32>.CountBenchmark0.430.00-100
System.Tests.Perf_String.Replace_Char(text: "yfesgj0sg1ijslnjsb3uofdz3tbzf6ysgblu3at20nfab2wei1kxfbvsbpzwhanjczcqa2psra3aacxb67qnwbnfp2tok6v0a58lzfdql1fehvs91yzkt9xam7ahjbhvpd9edll13ab46i74ktwwgkgbi792e5gkuuzevo5qm8qt83edag7zovoe686gmtw730kms2i5xgji4xcp25287q68fvhwszd3mszht2uh7bchlgkj5qnq1x9m4lg7vwn8cq5l756akua6oyx9k71bmxbysnmhvxvlxde4k9maumfgxd8gxhxx4mwpph2ttyox9zilt3ylv1q9s4bopfuoa8qlrzodg2q67sh85wx4slcd6w7ufnendaxai633ove2ktbaxdt2sz6y6mo42473xd274gz833p6hj3mu77c4m4od9e5s8btxleh0efqnu9zj9rwtbk5758lio35b3q426j5fwwq1qyknfedrsmqyfw1m38mkkotdf7n0vr6p3erhy8dkzntr9fwjrslxjgrbegih0n6bpb5bfuy55bu65ce9kejcfifxwpcs05umrsb8kvd64q2iwugbbi7vd35g5ho0rff9rhombgzzaniyq7bbjbqr88jyw4ccgnoyl31of3a5thv0vg08gnrqzxas800hewtw8tnwgw5pav81ntdpdd62689x3iqpc317y82b3e2trbpdzieoxldaz009tz37gqmh4bdp1bv9lnl5s58udb11z0h7i2sdl5nbyhjyfzxwzezmp4qx0i3eyvsd3fg8sryq9jhlvkonnfcvb4snl4mcbimdzg49tzdhqjmfxfcq3p1st6b9x2xyevo17evpqp4yc4f2rm0f26ivr3t2f5m0boc44vituxaovcqy1jrkcs6im2kdu3jvcexx2k76egve63aon5a6nbxss4rcke90npmqp35qluf571ms160y2nhaqef835wah41qru8tauu362v0r8konl8", oldChar: 'b', newChar: '+')99861.872074.68-97.92
System.Runtime.Intrinsics.Tests.Perf_Vector128Float.CountBenchmark2.790.07-97.41
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<SByte>.UnaryNegateOperatorBenchmark234.806.26-97.33
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Byte>.UnaryNegateOperatorBenchmark246.336.63-97.30
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<SByte>.NegateBenchmark235.816.49-97.24
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Byte>.NegateBenchmark235.546.56-97.21
System.Numerics.Tests.Perf_VectorOf<UInt64>.CountBenchmark3.100.09-97.00
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<SByte>.LessThanBenchmark273.328.63-96.84
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Byte>.LessThanBenchmark273.208.91-96.73
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Byte>.EqualsStaticBenchmark273.849.19-96.64
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Byte>.SubtractBenchmark247.268.65-96.50
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Byte>.GreaterThanBenchmark250.978.85-96.47
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<SByte>.SubtractBenchmark244.278.76-96.41
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<SByte>.MultiplyOperatorBenchmark249.178.97-96.40
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Byte>.AddBenchmark238.408.67-96.36
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<SByte>.AddOperatorBenchmark236.358.68-96.32

The most improved groupings of benchmark are System.Buffers, System.Collections, System.Memory, and System.Text as outlined in dotnet/perf-autofiling-issues#14324, dotnet/perf-autofiling-issues#14325, dotnet/perf-autofiling-issues#14326, dotnet/perf-autofiling-issues#14325, dotnet/perf-autofiling-issues#14355, dotnet/perf-autofiling-issues#14359, and dotnet/perf-autofiling-issues#14361. The changes implemented in #83498 and #83490 increased inlining length limit from 20 to 30 and implemented shr.un.imm which improved over 1000 microbenchmarks.

Add vector horizontal sums on Arm64 #83675 improved about 20 microbenchmarks, as detailed in dotnet/perf-autofiling-issues#14531.

Changes in #83512 caused both improvements and regressions as reported in dotnet/perf-autofiling-issues#15008 and dotnet/perf-autofiling-issues#15154.

Regressions

Here is a list of top 20 regressed microbenchmarks in Preview 3.

NameBaseline ValueCompare Value% Difference
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<SByte>.CountBenchmark0.000.12661187.94
System.Numerics.Tests.Perf_VectorOf<Int16>.CountBenchmark0.010.182061.26
System.Numerics.Tests.Perf_Vector3.EqualsBenchmark23.78443.271764.35
System.Numerics.Tests.Perf_Vector4.EqualsBenchmark24.01406.031590.83
System.Numerics.Tests.Perf_Vector2.EqualsBenchmark33.71435.391191.71
System.Numerics.Tests.Perf_Matrix3x2.EqualsBenchmark162.131346.77730.69
System.Numerics.Tests.Perf_Plane.EqualsBenchmark57.84411.46611.36
System.Numerics.Tests.Perf_Quaternion.EqualsBenchmark80.35436.94443.80
System.Numerics.Tests.Perf_VectorOf<SByte>.CountBenchmark0.040.20431.24
System.Numerics.Tests.Perf_Matrix4x4.EqualsBenchmark376.191808.21380.66
System.Numerics.Tests.Perf_Vector4.ZeroBenchmark0.992.52154.02
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Double>.EqualsBenchmark124.90305.09144.27
System.Numerics.Tests.Perf_VectorOf<Int32>.CountBenchmark0.190.44127.07
System.Runtime.Intrinsics.Tests.Perf_Vector128Float.EqualsBenchmark191.86410.58113.99
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Single>.EqualsBenchmark199.71410.56105.57
System.Threading.Tests.Perf_Thread.CurrentThread3.506.3781.95
System.Net.Http.Tests.SocketsHttpHandlerPerfTest.Get_EnumerateHeaders_Unvalidated(ssl: True, chunkedResponse: True, responseLength: 100000)1951914.283529445.5380.81
System.Text.Json.Serialization.Tests.ReadJson<BinaryData>.DeserializeFromReader(Mode: SourceGen)33011.3159326.0479.71
System.Globalization.Tests.StringSearch.IsSuffix_DifferentLastChar(Options: (en-US, OrdinalIgnoreCase, False))913.261618.9077.26
System.Text.Json.Serialization.Tests.ReadJson<BinaryData>.DeserializeFromReader(Mode: Reflection)32968.6658440.4577.26

Preview 2

There are a number of improvements introduced in Preview 2 to individually call out. The following section presents only major improvements with high-level analysis. The analysis should be taken dubiously and readers are encouraged to examine benchmark reports for thorough analysis. We encourage readers to examine the benchmark reports and to call out major improvements not mentioned in this report.

Mono AOT compiler

The following sections presents improvements and regressions introduced in Mono AOT compiler in the Preview 2.

Improvements

Here is a list of top 20 microbenchmarks improvements in Preview 2. Full report available here.

NameBaseline ValueCompare ValueDifference% Difference
System.Collections.Concurrent.Count<Int32>.Dictionary(Size: 512)34.07 μs310.43 ns-33756.76 ns99%
System.Collections.Concurrent.Count<String>.Dictionary(Size: 512)17.32 μs314.25 ns-17007.28 ns98%
System.Tests.Perf_Decimal.Floor81.17 ns16.81 ns-64.36 ns79%
System.Tests.Perf_Decimal.Round82.24 ns18.69 ns-63.55 ns77%
System.Tests.Perf_UInt32.TryFormat(value: 0)78.23 ns20.05 ns-58.18 ns74%
System.Tests.Perf_Int32.TryFormat(value: 4)78.02 ns20.47 ns-57.55 ns74%
System.Collections.TryGetValueFalse<String, String>.ConcurrentDictionary(Size: 512)44.69 μs12.92 μs-31.77 μs71%
System.Tests.Perf_Decimal.Divide346.08 ns102.16 ns-243.92 ns70%
System.Collections.ContainsKeyFalse<String, String>.ConcurrentDictionary(Size: 512)45.29 μs13.50 μs-31.79 μs70%
System.Text.Json.Reader.Tests.Perf_Base64.ReadBase64EncodedByteArray_HeavyEscaping(NumberOfBytes: 1000)8.93 μs2.77 μs-6.16 μs69%
System.Text.Json.Reader.Tests.Perf_Base64.ReadBase64EncodedByteArray_NoEscaping(NumberOfBytes: 1000)8.83 μs2.77 μs-6.06 μs69%
System.Tests.Perf_UInt64.TryFormat(value: 0)84.40 ns26.53 ns-57.87 ns69%
System.Tests.Perf_Byte.ToString(value: 255)91.65 ns29.95 ns-61.69 ns67%
System.Tests.Perf_Version.TryFormat3265.42 ns88.04 ns-177.38 ns67%
System.Tests.Perf_Version.TryFormat4345.05 ns115.05 ns-230.00 ns67%
System.Collections.TryGetValueTrue<String, String>.ConcurrentDictionary(Size: 512)49.50 μs16.53 μs-32.97 μs67%
System.Tests.Perf_Version.TryFormat2176.63 ns59.61 ns-117.02 ns66%
System.Collections.ContainsKeyTrue<String, String>.ConcurrentDictionary(Size: 512)50.43 μs17.54 μs-32.89 μs65%
LinqBenchmarks.Where01ForX1.57 secs548.00 ms-1022.61 ms65%
LinqBenchmarks.Where01LinqMethodX1.68 secs588.39 ms-1095.38 ms65%

The most improved groupings of benchmark are System.Collections, System.Decimal, System.Int, and System.Text as outlined in dotnet/perf-autofiling-issues#12996, dotnet/perf-autofiling-issues#13006, dotnet/perf-autofiling-issues#13217, and dotnet/perf-autofiling-issues#13264. The changes implemented in #81695 intrinsified RuntimeHelpers.CreateSpan<T> widely used in the BCL and replaced icall performance path.

Arm64 SIMD operations implemented in #83094 and #82420 improved over 1000 microbenchmarks according to the dotnet/perf-autofiling-issues#13808, dotnet/perf-autofiling-issues#13807, dotnet/perf-autofiling-issues#14023, and dotnet/perf-autofiling-issues#13990.

The grouping of benchmarks related to System.Collections have been improved by the changes made in #81902. as outlined in dotnet/perf-autofiling-issues#13220. The changes added support for v128 constants and improved performance in about 75 microbenchmarks.

The benchmark grouping of System.Text has been improved by the addition of S.R.I Vectors in JsonReaderHelper, introduced in #81758 and outlined in dotnet/perf-autofiling-issues#12993. Furthermore, improved handling of the ldtoken+ltoken+Type::op_EqualThe optimization implemented in #81277 have significantly improved the benchmark grouping of System.Text, as detailed in dotnet/perf-autofiling-issues#12313.

The changes introduced in #81306 removed types deriving from JsonTypeInfo<T> have had a positive impact on the benchmark groupings of both System.Numerics and System.Collections, as reported in dotnet/perf-autofiling-issues#12488 and dotnet/perf-autofiling-issues#12550.

All above mentioned changes are speed-related improvements of microbechmarks. There was a significant size improvement on WASM and iOS by enabling deduplication of generics. Issue #80419 contains references to changes that reduced size on disk (SOD) for about 11% and 3% respectively.

Regressions

Here is a list of top 20 microbenchmarks regressions in Preview 2. Full report available here.

NameBaseline ValueCompare ValueDifference% Difference
System.Tests.Perf_Random.Next_long_unseeded10.17 ns28.84 ns18.67 ns-184%
System.Numerics.Tests.Perf_Vector4.EqualityOperatorBenchmark0.79 ns1.96 ns1.17 ns-148%
System.Numerics.Tests.Perf_Vector3.TransformByMatrix4x4Benchmark60.14 ns140.30 ns80.17 ns-133%
System.Numerics.Tests.Perf_Vector3.TransformNormalByMatrix4x4Benchmark60.73 ns132.19 ns71.46 ns-118%
System.Numerics.Tests.Perf_Vector4.TransformVector3ByMatrix4x4Benchmark62.72 ns131.48 ns68.76 ns-110%
System.Numerics.Tests.Perf_Vector4.TransformByMatrix4x4Benchmark63.09 ns131.10 ns68.00 ns-108%
System.Numerics.Tests.Perf_Vector2.TransformByMatrix4x4Benchmark56.47 ns112.12 ns55.65 ns-99%
System.Numerics.Tests.Perf_Quaternion.LengthSquaredBenchmark7.76 ns14.35 ns6.59 ns-85%
System.Numerics.Tests.Perf_Vector2.TransformNormalByMatrix4x4Benchmark56.66 ns103.10 ns46.44 ns-82%
System.Numerics.Tests.Perf_Vector4.TransformVector2ByMatrix4x4Benchmark61.08 ns103.66 ns42.58 ns-70%
System.Numerics.Tests.Perf_Vector2.TransformByMatrix3x2Benchmark20.85 ns35.00 ns14.15 ns-68%
System.Numerics.Tests.Perf_BitOperations.LeadingZeroCount_uint667.85 ns1.10 μs428.39 ns-64%
System.Tests.Perf_Random.Next_long_long_unseeded14.28 ns22.44 ns8.15 ns-57%
System.Numerics.Tests.Perf_Quaternion.ConjugateBenchmark18.32 ns28.76 ns10.44 ns-57%
System.Numerics.Tests.Perf_Quaternion.InverseBenchmark26.70 ns41.60 ns14.89 ns-56%
System.Numerics.Tests.Perf_Quaternion.LengthBenchmark13.45 ns20.35 ns6.90 ns-51%
System.Numerics.Tests.Perf_BitOperations.LeadingZeroCount_ulong745.74 ns1.10 μs357.01 ns-48%
System.Numerics.Tests.Perf_BitOperations.Log2_ulong894.61 ns1.32 μs425.98 ns-48%
System.Numerics.Tests.Perf_Vector2.TransformNormalByMatrix3x2Benchmark21.03 ns30.87 ns9.85 ns-47%
System.Numerics.Tests.Perf_Vector3.ReflectBenchmark37.23 ns54.13 ns16.90 ns-45%

Here is a list of ongoing regressions in Preview 2 snapshot with short description.

Issue reportDescription
dotnet/perf-autofiling-issues#12546Quaternion and Plane SIMD intrinsics
dotnet/perf-autofiling-issues#12957Improve ConcurrentDictionary performance for strings
dotnet/perf-autofiling-issues#12660Improved codegen of the vector accelerated System.Numerics.* types
dotnet/perf-autofiling-issues#13187Implementation of Lemire's nearly divisionless method
dotnet/perf-autofiling-issues#13500Use of Array.Reverse<T> in ImmutableArray<T>.Builder.Reverse

Mono Interpreter

The following sections presents improvements and regressions introduced in Mono Interpreter in the Preview 2.

Improvements

Here is a list of top 20 microbenchmarks improvements in Preview 2. Full report available here.

NameBaseline ValueCompare ValueDifference% Difference
System.Collections.Concurrent.Count<Int32>.Dictionary(Size: 512)140.03 μs1.76 μs-138.26 μs99%
System.Collections.Concurrent.Count<String>.Dictionary(Size: 512)136.03 μs1.86 μs-134.17 μs99%
System.Threading.Tests.Perf_Interlocked.CompareExchange_long37.56 ns6.66 ns-30.90 ns82%
System.Threading.Tests.Perf_Interlocked.CompareExchange_int34.18 ns8.33 ns-25.85 ns76%
System.Buffers.Tests.RentReturnArrayPoolTests<Byte>.ProducerConsumer(RentalSize: 4096, ManipulateArray: False, Async: True, UseSharedPool: False)3.81 μs1.09 μs-2.72 μs71%
System.Numerics.Tests.Perf_Vector4.ZeroBenchmark3.21 ns0.99 ns-2.22 ns69%
System.Buffers.Tests.RentReturnArrayPoolTests<Object>.ProducerConsumer(RentalSize: 4096, ManipulateArray: False, Async: True, UseSharedPool: False)3.42 μs1.06 μs-2.36 μs69%
System.Tests.Perf_Decimal.Floor175.25 ns65.77 ns-109.48 ns62%
System.Numerics.Tests.Perf_Quaternion.LengthBenchmark63.64 ns24.08 ns-39.56 ns62%
System.Numerics.Tests.Perf_Quaternion.InequalityOperatorBenchmark89.74 ns34.82 ns-54.93 ns61%
System.Buffers.Tests.RentReturnArrayPoolTests<Byte>.ProducerConsumer(RentalSize: 4096, ManipulateArray: False, Async: False, UseSharedPool: False)4.34 μs1.70 μs-2.64 μs61%
System.Tests.Perf_Decimal.Round191.52 ns75.77 ns-115.76 ns60%
System.Numerics.Tests.Perf_Quaternion.DotBenchmark77.60 ns31.33 ns-46.27 ns60%
System.Numerics.Tests.Perf_Quaternion.DivideBenchmark88.55 ns36.47 ns-52.07 ns59%
System.Tests.Perf_Random.Next_int_int_unseeded154.47 ns65.37 ns-89.11 ns58%
System.Numerics.Tests.Perf_Quaternion.IsIdentityBenchmark81.52 ns35.06 ns-46.46 ns57%
System.Numerics.Tests.Perf_Quaternion.SubtractionOperatorBenchmark83.75 ns36.09 ns-47.67 ns57%
System.Numerics.Tests.Perf_Quaternion.SubtractBenchmark84.49 ns36.50 ns-47.99 ns57%
System.Collections.CtorFromCollection<Int32>.ConcurrentDictionary(Size: 512)461.77 μs200.10 μs-261.67 μs57%
System.Tests.Perf_UInt64.TryFormat(value: 0)250.12 ns109.72 ns-140.40 ns56%

The most improved groupings of benchmark are System.Collections, System.Numerics, and System.Decimal as outlined in dotnet/perf-autofiling-issues#12504, dotnet/perf-autofiling-issues#12544, dotnet/perf-autofiling-issues#13303, dotnet/perf-autofiling-issues#13247, dotnet/perf-autofiling-issues#13752, dotnet/perf-autofiling-issues#13761, and dotnet/perf-autofiling-issues#12744. The changes implemented in #81335 which intrinsified System.Numerics.* types, in #82093 which intrinsified CreateSpan, and in #81782 which introduced common Vector128 SIMD operations widely used in the BCL improved over 1000 microbenchmarks.

Implementation of synch block fast paths created a regression in Mono AOT compiler #81380, but led to an improvement of about 100 microbenchmarks in Mono Interpreter, as detailed in dotnet/perf-autofiling-issues#13245.

Similar to a change in AOT compiler, changes introduced in #81306 removed types deriving from JsonTypeInfo<T> improved several microbenchmarks in Mono Interpreter. Improve ConcurrentDictionary performance for strings in #81557 improved dotnet/perf-autofiling-issues#13003. Also, code refactors led to several improvements presented in dotnet/perf-autofiling-issues#12301.

Regressions

Here is a list of top 20 microbenchmarks regressions in Preview 2. Full report available here.

NameBaseline ValueCompare ValueDifference% Difference
System.Numerics.Tests.Perf_VectorOf<UInt64>.CountBenchmark0.06 ns3.10 ns3.04 ns-5,059%
System.Runtime.Intrinsics.Tests.Perf_Vector128Of<Int16>.CountBenchmark0.36 ns1.75 ns1.39 ns-391%
System.Collections.TryAddDefaultSize<String>.ConcurrentDictionary(Count: 512)297.96 μs574.34 μs276.38 μs-93%
System.Numerics.Tests.Perf_Vector2.UnitYBenchmark7.38 ns13.69 ns6.31 ns-85%
HardwareIntrinsics.RayTracer.SoA.Render2.41 ns4.38 ns1.97 ns-82%
System.Numerics.Tests.Perf_Vector2.TransformByMatrix3x2Benchmark48.06 ns86.28 ns38.22 ns-80%
System.IO.Compression.Brotli.Compress_WithoutState(level: Fastest, file: "TestDocument.pdf")291.36 μs522.83 μs231.47 μs-79%
System.IO.Compression.Brotli.Compress_WithState(level: Fastest, file: "TestDocument.pdf")296.93 μs525.99 μs229.06 μs-77%
System.Numerics.Tests.Perf_Vector2.TransformNormalByMatrix3x2Benchmark44.65 ns75.61 ns30.96 ns-69%
System.Memory.Constructors_ValueTypesOnly<Byte>.ReadOnlyFromPointerLength6.33 ns10.49 ns4.16 ns-66%
PerfLabTests.EnumPerf.ObjectGetTypeNoBoxing3.87 ns6.20 ns2.32 ns-60%
System.Numerics.Tests.Perf_Vector3.SquareRootBenchmark23.34 ns37.02 ns13.68 ns-59%
System.Numerics.Tests.Perf_Vector3.TransformNormalByMatrix4x4Benchmark124.53 ns196.66 ns72.12 ns-58%
System.Diagnostics.Perf_Process.StartAndWaitForExit871.51 μs1.35 ms474.57 μs-54%
System.Numerics.Tests.Perf_Vector3.TransformByMatrix4x4Benchmark144.68 ns217.99 ns73.31 ns-51%
System.Collections.AddGivenSize<String>.List(Size: 512)12.21 μs18.32 μs6.11 μs-50%
System.IO.Tests.BinaryWriterExtendedTests.WriteAsciiCharArray(StringLengthInChars: 2000000)8.14 ms12.20 ms4.06 ms-50%
System.Numerics.Tests.Perf_VectorOf<Int32>.ZeroBenchmark3.20 ns4.80 ns1.59 ns50%
System.Buffers.Tests.RentReturnArrayPoolTests<Byte>.ProducerConsumer(RentalSize: 4096, ManipulateArray: False, Async: True, UseSharedPool: True)5.73 μs8.56 μs2.83 μs-49%
System.Buffers.Tests.RentReturnArrayPoolTests<Object>.ProducerConsumer(RentalSize: 4096, ManipulateArray: False, Async: True, UseSharedPool: True)5.62 μs8.37 μs2.75 μs-49%

Here is a list of ongoing regressions in Preview 2 snapshot with short description.

Issue reportDescription
dotnet/perf-autofiling-issues#12707use of not implemented Vector operations
dotnet/perf-autofiling-issues#13747Intrinsified common Vector128 operations

Preview 1

This report presents .NET 8 Preview 1 overview of major performance improvements and regressions in Mono Interpreter.

Improvements

Here is a list of top 20 microbenchmarks improvements in Preview 1.

NameBaseline ValueCompare ValueDifference% Difference
System.Numerics.Tests.Perf_VectorOf<Byte>.LessThanAnyBenchmark292.17 ns18.88 ns-273.29 ns94%
System.Numerics.Tests.Perf_VectorOf<Byte>.LessThanOrEqualAnyBenchmark298.08 ns20.47 ns-277.61 ns93%
System.Numerics.Tests.Perf_VectorOf<SByte>.LessThanOrEqualAnyBenchmark294.38 ns20.33 ns-274.05 ns93%
System.Numerics.Tests.Perf_VectorOf<SByte>.LessThanAnyBenchmark298.45 ns20.63 ns-277.82 ns93%
System.Numerics.Tests.Perf_VectorOf<Byte>.GreaterThanOrEqualAllBenchmark331.73 ns24.25 ns-307.48 ns93%
System.Numerics.Tests.Perf_VectorOf<UInt16>.GreaterThanOrEqualAllBenchmark218.05 ns20.58 ns-197.47 ns91%
System.Numerics.Tests.Perf_VectorOf<Int16>.GreaterThanAllBenchmark209.57 ns20.48 ns-189.08 ns90%
System.Numerics.Tests.Perf_VectorOf<Int16>.GreaterThanOrEqualAllBenchmark231.47 ns23.03 ns-208.44 ns90%
System.Numerics.Tests.Perf_VectorOf<Int16>.LessThanOrEqualAnyBenchmark188.87 ns20.02 ns-168.84 ns89%
System.Numerics.Tests.Perf_VectorOf<Int16>.LessThanAnyBenchmark186.21 ns20.05 ns-166.16 ns89%
System.Numerics.Tests.Perf_VectorOf<UInt16>.LessThanOrEqualAnyBenchmark189.87 ns20.76 ns-169.11 ns89%
System.Numerics.Tests.Perf_VectorOf<UInt16>.LessThanAnyBenchmark186.54 ns21.38 ns-165.15 ns89%
System.Memory.Span<Byte>.IndexOfAnyFourValues(Size: 512)11.82 μs1.60 μs-10.23 μs87%
System.Memory.Span<Byte>.IndexOfAnyFiveValues(Size: 512)14.32 μs2.42 μs-11.90 μs83%
System.Numerics.Tests.Perf_VectorOf<Int32>.GreaterThanAllBenchmark120.71 ns20.59 ns-100.11 ns83%
System.Numerics.Tests.Perf_VectorOf<UInt32>.GreaterThanAllBenchmark124.72 ns21.39 ns-103.32 ns83%
System.Numerics.Tests.Perf_VectorOf<Single>.GreaterThanOrEqualAllBenchmark136.11 ns24.20 ns-111.91 ns82%
System.Numerics.Tests.Perf_VectorOf<Single>.GreaterThanAllBenchmark128.50 ns24.30 ns-104.20 ns81%
System.Numerics.Tests.Perf_VectorOf<UInt64>.GreaterThanAllBenchmark105.81 ns20.48 ns-85.33 ns81%
System.Numerics.Tests.Perf_VectorOf<Int64>.GreaterThanAllBenchmark105.16 ns20.57 ns-84.60 ns80%

There are a number of improvements introduced in Preview 1 to individually call out. The following section presents only major improvements with high-level analysis.
The analysis should be taken dubiously and readers are encouraged to examine benchmark reports for thorough analysis.

The most improved groupings of benchmark are System.Runtime.Vectors, System.Runtime.Intrinsics and System.Collections as outlined here and in dotnet/perf-autofiling-issues#10468.
Adding stobj.vt.noref version for no reference case that is twice as fast compared to the stobj.v improved over 400 microbenchmarks as outlined in dotnet/perf-autofiling-issues#10468 and dotnet/perf-autofiling-issues#10464.

SpanHelpers are widly used in BCL and improvements related to them could significantly improve performance. Changes in 200a90a, 7fa0d5b, and c0447bc removed mono-specific SpanHelpers, replaced branch patterns with super-instructions, and improved detection of dead bblocks. Over 300 microbenchmarks are improved as outlined in dotnet/perf-autofiling-issues#10989 and dotnet/perf-autofiling-issues#11155.
Change #77331 simplified getitem.span opcode and avoided typical use of ldloca with it, which improved over 50 microbenchmarks.

Allow passing vtypes with a single scalar field to native code using the faster code path improved System.Text an System.Collections groupings of benchmarks as outlined in dotnet/perf-autofiling-issues#10987 and dotnet/perf-autofiling-issues#10938. The assumption is that those libraries rely on ObjectHandleOnStack types.

Intrinsic for string allocation newstr in #79392 improved various microbenchmarks as outlined in dotnet/perf-autofiling-issues#10694 and dotnet/perf-autofiling-issues#10670.

9a65109 contributed to dotnet/perf-autofiling-issues#10695 and dotnet/perf-autofiling-issues#10671.

All above mentioned changes are speed improvements of microbechmarks. There was a significant size improvement in web assembly by #79672 that reduced size on disk (SOD) in blazor template application for ~270kb by trimming S.N.Vector class in non-SIMD cases. With deduplication of symbols in web assembly additional size savings are achieved.

Regressions

Here is a list of top 20 microbenchmarks regressions in Preview 1.

NameBaseline ValueCompare ValueDifference% Difference
System.Numerics.Tests.Perf_VectorOf<Byte>.CountBenchmark0.10 ns1.10 ns1.00 ns-969%
System.Tests.Perf_String.Replace_Char(text: "yfesgj0sg1ijslnjsb3uofdz3tbzf6ysgblu3at20nfab2wei1kxfbvsbpzwhanjczcqa2psra3aacxb67qnwbnfp2tok6v0a58lzfdql11.63 μs101.96 μs90.33 μs-777%
System.Tests.Perf_String.Replace_Char(text: "yfesgj0sg1ijslnjsb3uofdz3tbzf6ysgblu3at20nfab2wei1kxfbvsbpzwhanjczcqa2psra3aacxb67qnwbnfp2tok6v0a58l", ol1.30 μs8.82 μs7.52 μs-578%
System.Tests.Perf_Byte.ToString(value: 255)38.31 ns257.96 ns219.65 ns-573%
System.Tests.Perf_String.Replace_String(text: "This is a very nice sentence. This is another very nice sentence.", oldValue: "a", newValue: "b")962.59 ns6.30 μs5335.40 ns-554%
PerfLabTests.LowLevelPerf.IntegerFormatting6.08 ms34.30 ms28.21 ms-464%
System.Tests.Perf_Int32.ToString(value: 2147483647)59.17 ns332.19 ns273.01 ns-461%
System.Tests.Perf_Int16.ToString(value: 32767)53.24 ns297.84 ns244.60 ns-459%
System.Tests.Perf_Int32.ToString(value: 12345)52.90 ns293.56 ns240.66 ns-455%
System.Tests.Perf_String.Replace_Char(text: "This is a very nice sentence", oldChar: 'i', newChar: 'I')531.46 ns2.89 μs2355.30 ns-443%
System.Tests.Perf_SByte.ToString(value: 127)52.62 ns276.41 ns223.79 ns-425%
System.Numerics.Tests.Perf_Vector2.TransformNormalByMatrix4x4Benchmark21.70 ns108.97 ns87.28 ns-402%
System.Numerics.Tests.Perf_Vector2.TransformByMatrix4x4Benchmark26.37 ns114.02 ns87.65 ns-332%
System.Numerics.Tests.Perf_Matrix4x4.MultiplyByMatrixOperatorBenchmark246.08 ns1.04 μs797.11 ns-324%
System.Numerics.Tests.Perf_Matrix4x4.MultiplyByMatrixBenchmark243.24 ns1.02 μs779.98 ns-321%
System.Tests.Perf_Byte.ToString(value: 0)7.06 ns27.18 ns20.11 ns-285%
System.Numerics.Tests.Perf_Matrix4x4.CreateTranslationFromScalarXYZ25.27 ns91.61 ns66.34 ns-263%
System.Numerics.Tests.Perf_Matrix4x4.AddBenchmark90.93 ns304.20 ns213.27 ns-235%
System.Numerics.Tests.Perf_Matrix4x4.LerpBenchmark141.51 ns443.45 ns301.94 ns-213%
System.Numerics.Tests.Perf_Matrix4x4.SubtractOperatorBenchmark100.31 ns307.60 ns207.29 ns-207%

Here is a list of ongoing regressions in Preview 1 snapshot with short description.

Issue reportDescription
dotnet/perf-autofiling-issues#12299Extracted code outside of interp main loop
dotnet/perf-autofiling-issues#11449Investigating
dotnet/perf-autofiling-issues#11453Redundant ldloca and stfld opcodes in the new Matrix4x4 implementation
dotnet/perf-autofiling-issues#11147New ASCII APIs
#79973Dependencies update
#79336Managed implementation of UInt32ToDecStr
#79876Unoptimized pattern ldstr; if (uncommon) throw ex (string)

Metadata

Metadata

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions