-
Notifications
You must be signed in to change notification settings - Fork 5.2k
Closed
Labels
Milestone
Description
Description
When trying out .NET 7 Preview 7 the runtime of some our tests approximately increased by ~100% from 0.9s from 1.8s compared to .NET 6.0.8.
I traced the majority of the regression to calls to Microsoft.SqlServer.Types and bisected the regression to be introduced in .NET 7 Preview 5.
To reproduce download STIntersection.zip and run
dotnet run -c release --framework net7.0
Configuration
Intel Core i7-10750H CPU 2.60GHz, 1 CPU, 12 logical and 6 physical cores
BenchmarkDotNet=v0.13.2, OS=Windows 10 (10.0.19044.1889/21H2/November2021Update)
HardwareIntrinsics=AVX2,AES,BMI1,BMI2,FMA,LZCNT,PCLMUL,POPCNT VectorSize=256
GC=Concurrent Workstation
See each detail section below for the version of .NET used in the different benchmarks.
Regression?
Yes.
.NET 7 Preview 4 has same performance as .NET 6.0.8.
.NET 7 Preview 5 is 50% slower than .NET 6.0.8
Data
.NET 7 Preview 4
BenchmarkDotNet=v0.13.2, OS=Windows 10 (10.0.19044.1889/21H2/November2021Update)
Intel Core i7-10750H CPU 2.60GHz, 1 CPU, 12 logical and 6 physical cores
.NET SDK=7.0.100-preview.4.22252.9
[Host] : .NET 7.0.0 (7.0.22.22904), X64 RyuJIT AVX2
.NET 6.0 : .NET 6.0.8 (6.0.822.36306), X64 RyuJIT AVX2
.NET 7.0 : .NET 7.0.0 (7.0.22.22904), X64 RyuJIT AVX2
Method | Job | Runtime | Mean | Error | StdDev | Ratio | Code Size |
---|---|---|---|---|---|---|---|
STIntersection | .NET 6.0 | .NET 6.0 | 72.61 us | 0.795 us | 0.744 us | 1.00 | 871 B |
STIntersection | .NET 7.0 | .NET 7.0 | 72.86 us | 0.177 us | 0.148 us | 1.00 | 754 B |
.NET 7 Preview 5
BenchmarkDotNet=v0.13.2, OS=Windows 10 (10.0.19044.1889/21H2/November2021Update)
Intel Core i7-10750H CPU 2.60GHz, 1 CPU, 12 logical and 6 physical cores
.NET SDK=7.0.100-preview.5.22307.18
[Host] : .NET 7.0.0 (7.0.22.30112), X64 RyuJIT AVX2
.NET 6.0 : .NET 6.0.8 (6.0.822.36306), X64 RyuJIT AVX2
.NET 7.0 : .NET 7.0.0 (7.0.22.30112), X64 RyuJIT AVX2
Method | Job | Runtime | Mean | Error | StdDev | Ratio | RatioSD | Code Size |
---|---|---|---|---|---|---|---|---|
STIntersection | .NET 6.0 | .NET 6.0 | 72.02 us | 0.865 us | 0.809 us | 1.00 | 0.00 | 871 B |
STIntersection | .NET 7.0 | .NET 7.0 | 108.81 us | 1.078 us | 0.956 us | 1.51 | 0.03 | 756 B |
.NET 7 Preview 7
BenchmarkDotNet=v0.13.2, OS=Windows 10 (10.0.19044.1889/21H2/November2021Update)
Intel Core i7-10750H CPU 2.60GHz, 1 CPU, 12 logical and 6 physical cores
.NET SDK=7.0.100-preview.7.22377.5
[Host] : .NET 7.0.0 (7.0.22.37506), X64 RyuJIT AVX2
.NET 6.0 : .NET 6.0.8 (6.0.822.36306), X64 RyuJIT AVX2
.NET 7.0 : .NET 7.0.0 (7.0.22.37506), X64 RyuJIT AVX2
Method | Job | Runtime | Mean | Error | StdDev | Ratio | RatioSD | Code Size |
---|---|---|---|---|---|---|---|---|
STIntersection | .NET 6.0 | .NET 6.0 | 71.49 us | 0.638 us | 0.533 us | 1.00 | 0.00 | 871 B |
STIntersection | .NET 7.0 | .NET 7.0 | 110.30 us | 1.366 us | 1.277 us | 1.54 | 0.02 | 662 B |
.NET 7 RC 1
BenchmarkDotNet=v0.13.2, OS=Windows 10 (10.0.19044.2006/21H2/November2021Update)
Intel Core i7-10750H CPU 2.60GHz, 1 CPU, 12 logical and 6 physical cores
.NET SDK=7.0.100-rc.1.22431.12
[Host] : .NET 7.0.0 (7.0.22.42610), X64 RyuJIT AVX2
.NET 6.0 : .NET 6.0.9 (6.0.922.41905), X64 RyuJIT AVX2
.NET 7.0 : .NET 7.0.0 (7.0.22.42610), X64 RyuJIT AVX2
Method | Job | Runtime | Mean | Error | StdDev | Ratio | RatioSD |
---|---|---|---|---|---|---|---|
STIntersection | .NET 6.0 | .NET 6.0 | 69.30 us | 0.715 us | 0.669 us | 1.00 | 0.00 |
STIntersection | .NET 7.0 | .NET 7.0 | 106.24 us | 0.690 us | 0.646 us | 1.53 | 0.02 |
In this stack trace I notice that the module of dynamicClass.IL\_STUB\_PInvoke
is system.net.sockets.il
🤨
Partial call stack from VS
Function Name | Total CPU [unit, %] | Self CPU [unit, %] | Module | Category |
---|---|---|---|---|
+ Microsoft.SqlServer.Types.SqlGeography.STIntersection(Microsoft.SqlServer.Types.SqlGeography) | 22742 (80,75 %) | 13 (0,05 %) | microsoft.sqlserver.types | IO | Kernel | Runtime |
| + Microsoft.SqlServer.Types.GLNativeMethods.GeodeticCombine(CombineMode, Microsoft.SqlServer.Types.GeoData, Microsoft.SqlServer.Types.GeoData, float64) | 22636 (80,38 %) | 7 (0,02 %) | microsoft.sqlserver.types | IO | Kernel | Runtime |
|| + dynamicClass.IL_STUB_PInvoke(00007FFAD0D6A418, 00007FFAD0A1E260, 00007FFAD0A1E260, float64, 00007FFAD0D6A668) | 22395 (79,52 %) | 20 (0,07 %) | system.net.sockets.il | IO | Kernel |
||| + sqlserverspatial140.dll!0x00007ffadee891fb | 9243 (32,82 %) | 2 (0,01 %) | sqlserverspatial140 | IO | Kernel |
|||| + sqlserverspatial140.dll!0x00007ffadee99511 | 5837 (20,73 %) | 3 (0,01 %) | sqlserverspatial140 | IO | Kernel |
||||| + sqlserverspatial140.dll!0x00007ffadee7c465 | 4658 (16,54 %) | 2 (0,01 %) | sqlserverspatial140 | IO | Kernel |
|||||| + sqlserverspatial140.dll!0x00007ffadeed358c | 4436 (15,75 %) | 0 (0,00 %) | sqlserverspatial140 | IO | Kernel |
||||||| + sqlserverspatial140.dll!0x00007ffadee97f28 | 4399 (15,62 %) | 0 (0,00 %) | sqlserverspatial140 | IO | Kernel |
|||||||| + coreclr.dll!0x00007ffb2f0fd41e | 4223 (15,00 %) | 0 (0,00 %) | coreclr | IO | Kernel |
||||||||| + coreclr.dll!0x00007ffb2f07dd58 | 3487 (12,38 %) | 0 (0,00 %) | coreclr | IO | Kernel |
|||||||||| + coreclr.dll!0x00007ffb2f07ddce | 3124 (11,09 %) | 0 (0,00 %) | coreclr | IO | Kernel |
||||||||||| + coreclr.dll!0x00007ffb2efd2509 | 1974 (7,01 %) | 1 (0,00 %) | coreclr | IO | Kernel |
|||||||||||| + MapViewOfFile | 1972 (7,00 %) | 0 (0,00 %) | kernelbase | Kernel |
||||||||||||| + MapViewOfFileExNuma | 1972 (7,00 %) | 4 (0,01 %) | kernelbase | Kernel |
|||||||||||||| + NtMapViewOfSection | 1968 (6,99 %) | 41 (0,15 %) | ntdll | Kernel |
||||||||||||||| + 0xfffff8036e40a2b5 | 1885 (6,69 %) | 0 (0,00 %) | [Unknown Code] | |
|||||||||||||||| + 0xfffff8036e5e4829 | 1850 (6,57 %) | 0 (0,00 %) | [Unknown Code] | |
||||||||||||||||| + 0xfffff8036e5e7ccc | 1841 (6,54 %) | 0 (0,00 %) | [Unknown Code] | |
|||||||||||||||||| + 0xfffff8036e5e837e | 1553 (5,51 %) | 0 (0,00 %) | [Unknown Code] | |
||||||||||||||||||| + 0xfffff8036e5e9fc4 | 1552 (5,51 %) | 0 (0,00 %) | [Unknown Code] | |
|||||||||||||||||||| + 0xfffff8036e5ea160 | 1552 (5,51 %) | 0 (0,00 %) | [Unknown Code] | |
||||||||||||||||||||| + 0xfffff8036e252060 | 1220 (4,33 %) | 1218 (4,32 %) | [Unknown Code] | |
||||||||||||||||||||| - 0xfffff8036e25206c | 302 (1,07 %) | 302 (1,07 %) | [Unknown Code] | |
||||| - sqlserverspatial140.dll!0x00007ffadee7c450 | 1173 (4,17 %) | 0 (0,00 %) | sqlserverspatial140 | Kernel |
|||| - sqlserverspatial140.dll!0x00007ffadee994d8 | 3400 (12,07 %) | 0 (0,00 %) | sqlserverspatial140 | IO | Kernel |
||| + sqlserverspatial140.dll!0x00007ffadee89295 | 8091 (28,73 %) | 2 (0,01 %) | sqlserverspatial140 | IO | Kernel |
|||| + sqlserverspatial140.dll!0x00007ffadee86976 | 7869 (27,94 %) | 0 (0,00 %) | sqlserverspatial140 | IO | Kernel |
||||| + coreclr.dll!0x00007ffb2f0fd41e | 7768 (27,58 %) | 0 (0,00 %) | coreclr | IO | Kernel |
|||||| - coreclr.dll!0x00007ffb2f07dd58 | 3857 (13,70 %) | 0 (0,00 %) | coreclr | Kernel |
|||||| + coreclr.dll!0x00007ffb2f07dd45 | 3448 (12,24 %) | 0 (0,00 %) | coreclr | IO | Kernel |
||||||| + coreclr.dll!0x00007ffb2efd2509 | 2838 (10,08 %) | 4 (0,01 %) | coreclr | IO | Kernel |
|||||||| + MapViewOfFile | 2833 (10,06 %) | 0 (0,00 %) | kernelbase | Kernel |
||||||||| + MapViewOfFileExNuma | 2833 (10,06 %) | 7 (0,02 %) | kernelbase | Kernel |
|||||||||| + NtMapViewOfSection | 2826 (10,03 %) | 38 (0,13 %) | ntdll | Kernel |
||||||||||| + 0xfffff8036e40a2b5 | 2754 (9,78 %) | 0 (0,00 %) | [Unknown Code] | |
|||||||||||| + 0xfffff8036e5e4829 | 2733 (9,70 %) | 0 (0,00 %) | [Unknown Code] | |
||||||||||||| + 0xfffff8036e5e7ccc | 2726 (9,68 %) | 0 (0,00 %) | [Unknown Code] | |
|||||||||||||| + 0xfffff8036e5e837e | 2500 (8,88 %) | 0 (0,00 %) | [Unknown Code] | |
||||||||||||||| + 0xfffff8036e5e9fc4 | 2500 (8,88 %) | 0 (0,00 %) | [Unknown Code] | |
|||||||||||||||| + 0xfffff8036e5ea160 | 2494 (8,86 %) | 0 (0,00 %) | [Unknown Code] | |
||||||||||||||||| - 0xfffff8036e252060 | 1977 (7,02 %) | 1976 (7,02 %) | [Unknown Code] | |
||||||||||||||||| - 0xfffff8036e25206c | 488 (1,73 %) | 485 (1,72 %) | [Unknown Code] | |
||| + dynamicClass.IL_STUB_StructMarshal(ref sbyte, sbyte*, int, ref 00007FFAD0D6AC30) | 4428 (15,72 %) | 19 (0,07 %) | system.net.sockets.il | IO | Kernel |
|||| + coreclr.dll!0x00007ffb2f08a35d | 4382 (15,56 %) | 0 (0,00 %) | coreclr | IO | Kernel |
||||| + coreclr.dll!0x00007ffb2f08c13f | 3694 (13,12 %) | 0 (0,00 %) | coreclr | IO | Kernel |
|||||| + coreclr.dll!0x00007ffb2efd2509 | 3044 (10,81 %) | 1 (0,00 %) | coreclr | Kernel |
||||||| + MapViewOfFile | 3043 (10,81 %) | 1 (0,00 %) | kernelbase | Kernel |
|||||||| + MapViewOfFileExNuma | 3042 (10,80 %) | 9 (0,03 %) | kernelbase | Kernel |
||||||||| + NtMapViewOfSection | 3033 (10,77 %) | 46 (0,16 %) | ntdll | Kernel |
|||||||||| + 0xfffff8036e40a2b5 | 2945 (10,46 %) | 0 (0,00 %) | [Unknown Code] | |
||||||||||| + 0xfffff8036e5e4829 | 2914 (10,35 %) | 0 (0,00 %) | [Unknown Code] | |
|||||||||||| + 0xfffff8036e5e7ccc | 2910 (10,33 %) | 0 (0,00 %) | [Unknown Code] | |
||||||||||||| + 0xfffff8036e5e837e | 2611 (9,27 %) | 0 (0,00 %) | [Unknown Code] | |
|||||||||||||| + 0xfffff8036e5e9fc4 | 2609 (9,26 %) | 0 (0,00 %) | [Unknown Code] | |
||||||||||||||| + 0xfffff8036e5ea160 | 2603 (9,24 %) | 0 (0,00 %) | [Unknown Code] | |
|||||||||||||||| + 0xfffff8036e252060 | 2072 (7,36 %) | 2070 (7,35 %) | [Unknown Code] | |
|||||||||||||||| - 0xfffff8036e25206c | 491 (1,74 %) | 490 (1,74 %) | [Unknown Code] |