Skip to content

Cache GUID validation regex - #142

Merged
wforney merged 1 commit into
mainfrom
wforney-optimize-guid-validation
Sep 20, 2026
Merged

wforney merged 1 commit into
mainfrom
wforney-optimize-guid-validation

Conversation

@wforney

@wforney wforney commented Sep 16, 2026

Copy link
Copy Markdown
Member

Summary

  • Cache the GUID validation regex instead of constructing it for every IsGuid call.
  • Use [GeneratedRegex] on .NET 8+ and a compiled static regex on older target frameworks.
  • Replace Match(...).Success with IsMatch(...).

Performance scan: 10 opportunities

  1. GUID validation regexSharedCode.Core/Text/StringExtensions.cs:422; per-call regex construction and match-object work. Implemented here.
  2. HTML stripping regexStringExtensions.StripHtml; the pre-.NET 8 branch constructs a regex per call; cache a compiled fallback.
  3. Static regex source generationDomainRegex, EmailAddressRegex, SlugRegEx, SlugRegEx2, UrlRegEx, and ValidIpRegEx are static patterns that could use [GeneratedRegex] on modern targets.
  4. Chained digit replacements — Persian digit conversion chains ten Replace calls, creating multiple intermediate strings; use a single-pass translation.
  5. Slug normalization chain — slug generation combines multiple regex replacements, Trim, and a final replacement; reduce intermediate strings with a single generated regex or span-based pass.
  6. Enum cache lookupSharedCode.Core/Enum.cs:95 uses Hashtable.ContainsKey followed by an indexer, performing two lookups; use a typed dictionary and one lookup.
  7. JSON serializationSharedCode.Core/Extensions.cs:335 uses the reflection-based JsonSerializer.Serialize(input) overload; add cached options/source-generated contexts for known payloads.
  8. Assembly catalog scanningSharedCode.DependencyInjection/TypeSourceSelector.cs:231 repeatedly enumerates defined types with LINQ; cache immutable scan results when the same assemblies are selected repeatedly.
  9. Image encoder discoverySharedCode.Core/IO/StreamExtensions.cs calls ImageCodecInfo.GetImageEncoders() per image; cache the JPEG encoder.
  10. Stream-to-byte-array growthStreamExtensions.ToByteArray/ToByteArrayAsync allocate and grow a MemoryStream before copying; pre-size when the input length is known and avoid redundant copies where possible.

Validation

  • dotnet test SharedCode.Core.Tests\\Core.Tests.csproj --verbosity minimal — 782 passed, 2 skipped.
  • dotnet build SharedCode.Core\\Core.csproj --no-restore --no-dependencies -p:GeneratePackageOnBuild=false --verbosity minimal — all five target frameworks built successfully.
  • The normal packaging build still reports the repository's existing NU5019 missing C:\logo.png path.

Avoid compiling the GUID validation regex on every call and use the source-generated regex on modern target frameworks.\n\nCo-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot AI lite review requested due to automatic review settings September 16, 2026 16:10

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟢 Approval recommended

The change is scoped, validated successfully, and has no unresolved review issues.

Pull request overview

Caches GUID validation regexes across supported target frameworks while preserving existing behavior.

Changes:

  • Uses [GeneratedRegex] on .NET 8+.
  • Uses a compiled static regex on older frameworks.
  • Replaces Match(...).Success with IsMatch.
File summaries
File Description
SharedCode.Core/Text/StringExtensions.cs Implements cached GUID regex validation.
Review details
  • Files reviewed: 1/1 changed files
  • Comments generated: 0
  • Review effort level: Lite

💡 Configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

@github-actions

Copy link
Copy Markdown

Summary

Summary
Generated on: 9/16/2026 - 4:15:41 PM
Parser: Cobertura
Assemblies: 4
Classes: 195
Files: 158
Line coverage: 43.1% (3496 of 8109)
Covered lines: 3496
Uncovered lines: 4613
Coverable lines: 8109
Total lines: 19854
Branch coverage: 26.1% (1250 of 4784)
Covered branches: 1250
Total branches: 4784
Method coverage: Feature is only available for sponsors

Coverage

SharedCode.Core - 29.5%
Name Line Branch
SharedCode.Core 29.5% 25.9%
SharedCode.AssemblyExtensions 100% 100%
SharedCode.Attributes.DataFormatAttribute 100% 100%
SharedCode.Attributes.DataWidthAttribute 100% 100%
SharedCode.Attributes.StringValueAttribute 100% 100%
SharedCode.BaseException 100% 50%
SharedCode.Calendar.DateTimeExtensions 10.8% 0.7%
SharedCode.Calendar.DateTimeOffsetExtensions 70.3% 44.2%
SharedCode.Calendar.DayOfWeekExtensions 90.9% 87.5%
SharedCode.Collections.ArrayExtensions 92% 73.3%
SharedCode.Collections.Generic.EnumerableExtensions 0% 0%
SharedCode.Collections.Generic.EnumerableExtensions 0% 0%
SharedCode.Collections.Generic.EnumerationUtilities 100%
SharedCode.Collections.ListExtensions 14.2% 12.5%
SharedCode.Collections.ObservableCollectionExtensions 0% 0%
SharedCode.Data.DataReaderExtensions 0% 0%
SharedCode.Data.DataRowExtensions 0% 0%
SharedCode.Data.DataTableExtensions 0% 0%
SharedCode.DateTimeExtensions 0% 0%
SharedCode.DateTimeOffsetExtensions 0% 0%
SharedCode.Domain.Error 88.8%
SharedCode.Domain.ErrorResult 90.9% 100%
SharedCode.Domain.ErrorResult 72.7% 50%
SharedCode.Domain.HttpErrorResult 50%
SharedCode.Domain.Result 100%
SharedCode.Domain.Result 88.8%
SharedCode.Domain.ValidationError 75%
SharedCode.Domain.ValidationErrorResult 80%
SharedCode.Enum 93.2% 83.9%
SharedCode.Enum 50%
SharedCode.EnumExtensions 100%
SharedCode.EventArgs 100%
SharedCode.EventHandlerExtensions 75% 75%
SharedCode.Events.DomainEvent 0%
SharedCode.ExceptionExtensions 51% 32.7%
SharedCode.Extensions 23.6% 14.4%
SharedCode.Extensions 23.6% 14.4%
SharedCode.FluentTimeSpan 66.2% 71.4%
SharedCode.FunctionExtensions 100% 83.3%
SharedCode.FunctionExtensions<T, TResult> 100% 83.3%
SharedCode.IntExtensions 100% 100%
SharedCode.IO.BufferedWriter 0% 0%
SharedCode.IO.DirectoryInfoExtensions 0% 0%
SharedCode.IO.FileInfoExtensions 0% 0%
SharedCode.IO.StreamExtensions 0% 0%
SharedCode.IO.TcpClientExtensions 0% 0%
SharedCode.Linq.CollectionExtensions 58% 50.7%
SharedCode.Linq.CollectionExtensions.SyncChanges 0%
SharedCode.Linq.CollectionExtensions<T, TKey> 58% 50.7%
SharedCode.Linq.CollectionExtensions 58% 50.7%
SharedCode.Linq.EnumerableExtensions 35.7% 26.8%
SharedCode.Linq.EnumerableExtensions<T, TKey> 35.7% 26.8%
SharedCode.Linq.EnumerableExtensions<T, TResult> 35.7% 26.8%
SharedCode.Linq.EnumerableExtensions 35.7% 26.8%
SharedCode.Linq.EnumerableExtensions<TKey, TValue> 35.7% 26.8%
SharedCode.Linq.EnumeratorExtensions 0% 0%
SharedCode.Linq.ExpressionExtensions 0% 0%
SharedCode.Linq.PredicateBuilder 0% 0%
SharedCode.Linq.Predicates 100% 100%
SharedCode.Linq.QueryableExtensions 0%
SharedCode.Linq.QueryableExtensions 0%
SharedCode.Models.Entity 100%
SharedCode.Models.Entity 75% 75%
SharedCode.Notifications.Notification 0% 0%
SharedCode.Notifications.NotificationService 0% 0%
SharedCode.Notifications.ObservableExtensions 0% 0%
SharedCode.Notifications.ObservableExtensions 0% 0%
SharedCode.Notifications.ProducerConsumer 0% 0%
SharedCode.NumberExtensions 100%
SharedCode.Problems.Problem 0% 0%
SharedCode.Problems.ProblemConstants.Types 0%
SharedCode.Problems.ProblemCreationExtensions 0%
SharedCode.Problems.ProblemException 0% 0%
SharedCode.Problems.ProblemJsonConverter 0% 0%
SharedCode.PropertySupport 83.3% 60%
SharedCode.Reflection.DeepCloneCache 0% 0%
SharedCode.Reflection.DeepCloneCache 0% 0%
SharedCode.Reflection.DeepCloneExpressionGenerator 0% 0%
SharedCode.Reflection.DeepCloneGenerator 0% 0%
SharedCode.Reflection.DeepCloneGenerator 0% 0%
SharedCode.Reflection.DeepCloneMsilHelper 0% 0%
SharedCode.Reflection.DeepCloneSafeTypes 0% 0%
SharedCode.Reflection.DeepCloneState 0% 0%
SharedCode.Reflection.DeepCloneState.MiniDictionary 0% 0%
SharedCode.Reflection.ExpressionGenerator 0% 0%
SharedCode.Reflection.GenericExtensions 0% 0%
SharedCode.Reflection.ShallowCloneGenerator 0% 0%
SharedCode.Reflection.ShallowCloneHelper 0% 0%
SharedCode.Reflection.ShallowCloneHelper.ShallowSafeObjectCloneHelper 0%
SharedCode.Security.Hasher 38.6% 44.4%
SharedCode.Specifications.Builders.CacheSpecificationBuilder 50%
SharedCode.Specifications.Builders.IncludableBuilderExtensions 0% 0%
SharedCode.Specifications.Builders.IncludableSpecificationBuilder<T, TPrope
rty>
50%
SharedCode.Specifications.Builders.OrderedBuilderExtensions 50% 25%
SharedCode.Specifications.Builders.OrderedSpecificationBuilder 100%
SharedCode.Specifications.Builders.SpecificationBuilder<T, TResult> 100%
SharedCode.Specifications.Builders.SpecificationBuilder 100%
SharedCode.Specifications.Builders.SpecificationBuilderExtensions 100% 58.3%
SharedCode.Specifications.Evaluators.InMemorySpecificationEvaluator 96.2% 78.5%
SharedCode.Specifications.Evaluators.OrderEvaluator 45.9% 36.2%
SharedCode.Specifications.Evaluators.OrderEvaluator 45.9% 36.2%
SharedCode.Specifications.Evaluators.PaginationEvaluator 50% 37.5%
SharedCode.Specifications.Evaluators.WhereEvaluator 66.6% 37.5%
SharedCode.Specifications.Exceptions.DuplicateOrderChainException 0%
SharedCode.Specifications.Exceptions.DuplicateSkipException 25%
SharedCode.Specifications.Exceptions.DuplicateTakeException 25%
SharedCode.Specifications.Exceptions.SelectorNotFoundException 25%
SharedCode.Specifications.IncludeExpressionInformation 69.2% 40%
SharedCode.Specifications.Specification<T, TResult> 100%
SharedCode.Specifications.Specification 100%
SharedCode.Text.StringBuilderExtensions 100% 100%
SharedCode.Text.StringExtensions 27.6% 28.9%
SharedCode.Text.StringExtensions 27.6% 28.9%
SharedCode.Threading.Tasks.TaskExtensions 92.8%
SharedCode.Threading.Tasks.TaskExtensions 92.8%
SharedCode.Threading.Tasks.ValueTaskExtensions 0%
SharedCode.Threading.Tasks.ValueTaskExtensions<TException, TResult> 0%
SharedCode.Threading.Tasks.ValueTaskExtensions 0%
SharedCode.Threading.Tasks.ValueTaskExtensions 0%
SharedCode.TypeExtensions 33.3% 36%
SharedCode.TypeExtensions 33.3% 36%
SharedCode.Utilities 0% 0%
SharedCode.ValueObject 80% 90.9%
SharedCode.Workflow.Rule 0%
SharedCode.Workflow.Rule 0%
SharedCode.Workflow.RuleSet 0%
SharedCode.Workflow.RuleSet 0%
SharedCode.Xml.XDocumentExtensions 0% 0%
System.Text.RegularExpressions.Generated 38.1% 28.9%
System.Text.RegularExpressions.Generated.RunnerFactory
System.Text.RegularExpressions.Generated.RunnerFactory.Runner
SharedCode.Core.Tests - 98.1%
Name Line Branch
SharedCode.Core.Tests 98.1% 77.4%
SharedCode.Tests.AssemblyExtensionsTests 100%
SharedCode.Tests.AssertExtensions 0% 0%
SharedCode.Tests.Attributes.AttributeTests 100% 100%
SharedCode.Tests.BaseExceptionTests 100%
SharedCode.Tests.Calendar.DateTimeExtensionsTests 96.3% 100%
SharedCode.Tests.Calendar.DateTimeOffsetCalendarExtensionsTests 100%
SharedCode.Tests.Calendar.DayOfWeekExtensionsTests 100%
SharedCode.Tests.Collections.ArrayExtensionsTests 100% 100%
SharedCode.Tests.Collections.EnumerationUtilitiesTests 100%
SharedCode.Tests.Domain.ErrorResultTests 100%
SharedCode.Tests.Domain.ResultTests 100%
SharedCode.Tests.EnumExtensionsTests 100%
SharedCode.Tests.EnumTTests 96.2% 90%
SharedCode.Tests.EventHandlerExtensionsTests 100%
SharedCode.Tests.ExceptionExtensionsTests 100%
SharedCode.Tests.ExtensionsTests 100% 100%
SharedCode.Tests.ExtensionsTests.SampleRecord 100%
SharedCode.Tests.FluentTimeSpanTests 100%
SharedCode.Tests.FunctionExtensionsTests 100%
SharedCode.Tests.IntExtensionsTests 100%
SharedCode.Tests.LambdaComparer 0% 0%
SharedCode.Tests.Linq.CollectionExtensionsTests 100% 100%
SharedCode.Tests.Linq.EnumerableExtensionsTests 100% 100%
SharedCode.Tests.Linq.PredicatesTests 100%
SharedCode.Tests.Models.EntityTests 100%
SharedCode.Tests.NumberExtensionsTests 100%
SharedCode.Tests.PropertySupportTests 100% 100%
SharedCode.Tests.PropertySupportTests.SampleClass 100%
SharedCode.Tests.Security.HasherTests 100%
SharedCode.Tests.Specifications.SpecificationTests 97.7% 100%
SharedCode.Tests.Specifications.SpecificationTests.BuilderExposingSpecifica
tion
100%
SharedCode.Tests.Specifications.SpecificationTests.DuplicateSkipSpecificati
on
66.6%
SharedCode.Tests.Specifications.SpecificationTests.DuplicateTakeSpecificati
on
66.6%
SharedCode.Tests.Specifications.SpecificationTests.SampleEntity 100%
SharedCode.Tests.Specifications.SpecificationTests.SampleEntitySpecificatio
n
100% 100%
SharedCode.Tests.Specifications.SpecificationTests.SampleProjectionSpecific
ation
100% 100%
SharedCode.Tests.Specifications.SpecificationTests.SearchOnlySpecification 100%
SharedCode.Tests.Text.StringBuilderExtensionsTests 100%
SharedCode.Tests.Text.StringExtensionsTests 100% 100%
SharedCode.Tests.Threading.TaskExtensionsTests 100%
SharedCode.Tests.TypeExtensionsTests 100%
SharedCode.Tests.ValueObjectTests 96.8%
SharedCode.Tests.ValueObjectTests.Address 66.6%
SharedCode.Tests.ValueObjectTests.MoneyValue 100%
TUnit.Generated.Hooks.SharedCode_Tests_Calendar_DateTimeExtensionsTests_Ini
tTestCase_Before_Test.SharedCode_Tests_Calendar_DateTimeExtensionsTests_Ini
tTestCase_Before_TestInitializer
100%
TUnit.Generated.Hooks.SharedCode_Tests_Calendar_DateTimeExtensionsTests_Tea
rdownTestCase_After_Test.SharedCode_Tests_Calendar_DateTimeExtensionsTests_
TeardownTestCase_After_TestInitializer
100%
SharedCode.Data - 8.3%
Name Line Branch
SharedCode.Data 8.3% 0%
SharedCode.Data.AddOrUpdateDescriptor 0%
SharedCode.Data.CommandRepository 0% 0%
SharedCode.Data.DataReaderExtensions 0% 0%
SharedCode.Data.DataReaderExtensions 0% 0%
SharedCode.Data.DataRecordConverter 0% 0%
SharedCode.Data.DataServiceQueryExtensions 0% 0%
SharedCode.Data.DataServiceQueryExtensions 0% 0%
SharedCode.Data.DataServiceQueryExtensions 0% 0%
SharedCode.Data.DynamicDataRecord 0% 0%
SharedCode.Data.Exceptions.ColumnIsNotInResultSetException 0%
SharedCode.Data.Extensions 0% 0%
SharedCode.Data.ListExtensions 0% 0%
SharedCode.Data.PageBoundry 100%
SharedCode.Data.PagingDescriptor 100%
SharedCode.Data.QueryRepository 0% 0%
SharedCode.Data.QueryResult 100%
SharedCode.Data.Tests - 100%
Name Line Branch
SharedCode.Data.Tests 100% ****
SharedCode.Data.Tests.PageBoundryTests 100%
SharedCode.Data.Tests.PagingDescriptorTests 100%
SharedCode.Data.Tests.QueryResultTests 100%

@wforney
wforney merged commit 056bf8c into main Sep 20, 2026
13 checks passed
@wforney
wforney deleted the wforney-optimize-guid-validation branch September 20, 2026 12:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants