-
Notifications
You must be signed in to change notification settings - Fork 6
Description
I minimized the issue to the following minimum reproducible csproj:
dotnet-10-performance-degration.csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0-windows</TargetFramework>
<ReportAnalyzer>true</ReportAnalyzer>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Pure.DI" Version="2.2.14">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>none</IncludeAssets>
</PackageReference>
<PackageReference Include="TestableIO.System.IO.Abstractions.Analyzers" Version="2022.0.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>none</IncludeAssets>
</PackageReference>
<PackageReference Include="TestableIO.System.IO.Abstractions.Wrappers" Version="22.0.16" >
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>compile</IncludeAssets>
</PackageReference>
</ItemGroup>
</Project>Run this under .NET 10.0.100 with the command:
dotnet build dotnet-10-performance-degration.csproj -bl.
Note that there is no source file here, just the csproj is sufficient.
Upon inspecting the generate binary log file we can see the following:
Analyzer Report
Total analyzer execution time: 33.688 seconds.
Time (s) % Analyzer
33.674 99 System.IO.Abstractions.Analyzers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
4.569 13 System.IO.Abstractions.Analyzers.Analyzers.FileSystemTypeAnalyzers.DirectoryAnalyzer (IO0003)
4.475 13 System.IO.Abstractions.Analyzers.Analyzers.FileSystemTypeAnalyzers.StreamWriterAnalyzer (IO0010)
4.410 13 System.IO.Abstractions.Analyzers.Analyzers.FileSystemTypeAnalyzers.FileAnalyzer (IO0002)
4.161 12 System.IO.Abstractions.Analyzers.Analyzers.FileSystemTypeAnalyzers.PathAnalyzer (IO0006)
4.147 12 System.IO.Abstractions.Analyzers.Analyzers.FileSystemTypeAnalyzers.DirectoryInfoAnalyzer (IO0007)
4.025 11 System.IO.Abstractions.Analyzers.Analyzers.FileSystemTypeAnalyzers.StreamReaderAnalyzer (IO0011)
3.976 11 System.IO.Abstractions.Analyzers.Analyzers.FileSystemTypeAnalyzers.FileStreamAnalyzer (IO0005)
3.910 11 System.IO.Abstractions.Analyzers.Analyzers.FileSystemTypeAnalyzers.FileInfoAnalyzer (IO0004)
0.011 <1 Microsoft.CodeAnalysis.CSharp.NetAnalyzers, Version=10.0.100.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
0.003 <1 Microsoft.CodeAnalysis.NetAnalyzers, Version=10.0.100.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
<0.001 <1 Microsoft.Interop.ComInterfaceGenerator, Version=8.0.13.2707, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
<0.001 <1 Microsoft.Interop.LibraryImportGenerator, Version=8.0.13.2707, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
<0.001 <1 System.Text.RegularExpressions.Generator, Version=8.0.13.2707, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
For whatever reason the analyzer takes about 4 seconds to run which amounts to around 30ish second per project where this combination of analyzers exists.
Removing any of the three packages makes the issue go away. I tried few other analyzer combinations and couldn't reproduce it except in this specific format. The reason I create this issue here first as opposed to Pure.DI or .NET is that the report shows this analyzer spending most of the time.
For reference, running the same use case under version 9.0.200:
Analyzer Report
Total analyzer execution time: 8.489 seconds.
Time (s) % Analyzer
7.899 93 System.IO.Abstractions.Analyzers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
2.131 25 System.IO.Abstractions.Analyzers.Analyzers.FileSystemTypeAnalyzers.DirectoryAnalyzer (IO0003)
1.121 13 System.IO.Abstractions.Analyzers.Analyzers.FileSystemTypeAnalyzers.DirectoryInfoAnalyzer (IO0007)
1.030 12 System.IO.Abstractions.Analyzers.Analyzers.FileSystemTypeAnalyzers.FileAnalyzer (IO0002)
0.822 9 System.IO.Abstractions.Analyzers.Analyzers.FileSystemTypeAnalyzers.FileInfoAnalyzer (IO0004)
0.732 8 System.IO.Abstractions.Analyzers.Analyzers.FileSystemTypeAnalyzers.FileStreamAnalyzer (IO0005)
0.717 8 System.IO.Abstractions.Analyzers.Analyzers.FileSystemTypeAnalyzers.StreamReaderAnalyzer (IO0011)
0.675 7 System.IO.Abstractions.Analyzers.Analyzers.FileSystemTypeAnalyzers.PathAnalyzer (IO0006)
0.672 7 System.IO.Abstractions.Analyzers.Analyzers.FileSystemTypeAnalyzers.StreamWriterAnalyzer (IO0010)
0.318 3 Microsoft.CodeAnalysis.NetAnalyzers, Version=9.0.12.17301, Culture=neutral, PublicKeyToken=31bf3856ad364e35
0.240 2 Microsoft.CodeAnalysis.CSharp.NetAnalyzers, Version=9.0.12.17301, Culture=neutral, PublicKeyToken=31bf3856ad364e35
0.015 <1 Microsoft.Interop.LibraryImportGenerator, Version=9.0.12.26613, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
0.015 <1 Microsoft.Interop.ComInterfaceGenerator, Version=9.0.12.26613, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
0.002 <1 System.Text.RegularExpressions.Generator, Version=9.0.12.26613, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Similar results under .NET 8 too.