From 388c83bb9570377d1fa3e1ac685f4d05e3813eb9 Mon Sep 17 00:00:00 2001 From: Stephen Toub Date: Thu, 19 Jan 2023 20:02:22 -0500 Subject: [PATCH] Improve StringComparer.OrdinalIgnoreCase.Compare perf (#80813) --- .../src/System/StringComparer.cs | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/StringComparer.cs b/src/libraries/System.Private.CoreLib/src/System/StringComparer.cs index 93938b246adf6..8edcece63e8c0 100644 --- a/src/libraries/System.Private.CoreLib/src/System/StringComparer.cs +++ b/src/libraries/System.Private.CoreLib/src/System/StringComparer.cs @@ -318,7 +318,7 @@ public override int Compare(string? x, string? y) if (_ignoreCase) { - return string.Compare(x, y, StringComparison.OrdinalIgnoreCase); + return System.Globalization.Ordinal.CompareStringIgnoreCase(ref x.GetRawStringData(), x.Length, ref y.GetRawStringData(), y.Length); } return string.CompareOrdinal(x, y); @@ -418,7 +418,25 @@ private OrdinalIgnoreCaseComparer() : base(true) { } - public override int Compare(string? x, string? y) => string.Compare(x, y, StringComparison.OrdinalIgnoreCase); + public override int Compare(string? x, string? y) + { + if (ReferenceEquals(x, y)) + { + return 0; + } + + if (x == null) + { + return -1; + } + + if (y == null) + { + return 1; + } + + return System.Globalization.Ordinal.CompareStringIgnoreCase(ref x.GetRawStringData(), x.Length, ref y.GetRawStringData(), y.Length); + } public override bool Equals(string? x, string? y) {