Skip to content

Performance degradation under .NET 10 SDK #192

@W-Sebastian

Description

@W-Sebastian

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions