Skip to content

[Performance]: Glob expansion inside targets is missing important Exclude optimization #8984

@ladipro

Description

@ladipro

Issue Description

When glob expansion runs in a target via ItemGroupIntrinsicTask, it separately enumerates includes and excludes, then does the subtraction of their results. This may be prohibitively slow when excludes refer to large subdirectories.

Steps to Reproduce

<Project>
  <Target Name="Build">
    <ItemGroup>
      <MyResources Include="**\*.png;**\*.jpg" Exclude="bin\**\*.*;obj\**\*.*" />
    </ItemGroup>
    <Message Text="MyResources.Count: @(MyResources->Count())" />
  </Target>
</Project>

When evaluating the glob, there is no need to recurse into bin or obj at all. MSBuild can simply skip these directories when it enumerates all .png and .jpg files.

Data

An internal project is seeing >10 minutes spent running the ItemGroupIntrinsicTask due to this issue.

Analysis

These are the problematic calls:

foreach (string excludeSplit in excludes)
{
string[] excludeSplitFiles = EngineFileUtilities.GetFileListUnescaped(
Project.Directory,
excludeSplit,
loggingMechanism: LoggingContext,
excludeLocation: originalItem.ExcludeLocation);
foreach (string excludeSplitFile in excludeSplitFiles)
{
excludesUnescapedForComparison.Add(excludeSplitFile.NormalizeForPathComparison());
}
}

Versions & Configurations

No response

Regression

  • yes
  • no

Regression Details

No response

Metadata

Metadata

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions