Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Don't compile globbing regexes on .NET Framework #6632

Merged
merged 9 commits into from Jul 9, 2021

Conversation

ladipro
Copy link
Member

@ladipro ladipro commented Jun 28, 2021

Fixes #6599

Context

Compiled regular expressions have a high first-call cost on .NET Framework, especially when running in a 64-bit process. At best, they need to be used thousands of times to make up for the compilation cost. In some cases compiled regexes are even slower than interpreted ones.

Changes Made

Switched regexes used in MSBuildGlob to interpreted on .NET Framework. Also optimized capture groups as suggested by @ToddGrun and removed a couple of unused fields.

Testing

  • Existing unit tests with added coverage for MSBuildGlob.MatchInfoResult.
  • Experimental insertion to confirm the CPU time win.

src/Shared/FileMatcher.cs Show resolved Hide resolved
Copy link
Member

@Forgind Forgind left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

src/Build/Globbing/MSBuildGlob.cs Show resolved Hide resolved
@benvillalobos
Copy link
Member

As a change in this PR, can you modify the list in https://github.com/dotnet/msbuild/blob/main/documentation/wiki/ChangeWaves.md?

@marcpopMSFT marcpopMSFT added the merge-when-branch-open PRs that are approved, except that there is a problem that means we are not merging stuff right now. label Jul 9, 2021
@benvillalobos benvillalobos merged commit d150e93 into dotnet:main Jul 9, 2021
ladipro added a commit that referenced this pull request Aug 28, 2023
Contributes to [AB#1811625](https://devdiv.visualstudio.com/0bdbc590-a062-4c3f-b0f6-9383f67865ee/_workitems/edit/1811625)

### Context

Compiled regular expressions tend to run slower than interpreted ones on .NET Framework. Additionally, the cost of compiling is significant, especially on 64-bit.

Here's a benchmark running `IsMatch("Microsoft.NET.Sdk")` against the only SDK regex we ship inbox: `^(?i)vcpkg:.*`. Note that it does not include the compilation, which is an additional one-time cost.

![image](https://github.com/dotnet/msbuild/assets/12206368/2f12bc61-7dbe-444a-8213-d142c614d87c)

### Changes Made

Interpret `ResolvableSdkRegex` on .NET Framework. We made an analogous change to globbing some time ago in #6632.

### Testing

Existing unit tests, targeted micro benchmark.

### Notes

In the trace attached to the AzDO bug, this change eliminates 1/3 of the SDK resolution cost.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
changewave17.0 changewaves merge-when-branch-open PRs that are approved, except that there is a problem that means we are not merging stuff right now.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Glob matching has bad first-call performance on .NET Framework 64-bit
6 participants