Streamline MemoryExtension Trim and Trim(char) by removing calls to TrimStart/End...
authorAhson Khan <ahkha@microsoft.com>
Sat, 22 Sep 2018 00:47:47 +0000 (17:47 -0700)
committerGitHub <noreply@github.com>
Sat, 22 Sep 2018 00:47:47 +0000 (17:47 -0700)
* Mark TrimStart and TrimEnd as Aggressively Inline to improve perf

* Remove inlining attribute and streamline Trim

Commit migrated from https://github.com/dotnet/coreclr/commit/1fd5caec53c82d437d7c792d3dbf3e9f6a43e018

src/libraries/System.Private.CoreLib/src/System/MemoryExtensions.cs

index f0937c448b379abdb9085c811bd89d5dd968d6d3..1f5206b4177ea0068319d43e73237fe3249bbbe8 100644 (file)
@@ -26,7 +26,19 @@ namespace System
         /// </summary>
         public static ReadOnlySpan<char> Trim(this ReadOnlySpan<char> span)
         {
-            return span.TrimStart().TrimEnd();
+            int start = 0;
+            for (; start < span.Length; start++)
+            {
+                if (!char.IsWhiteSpace(span[start]))
+                    break;
+            }
+            int end = span.Length - 1;
+            for (; end >= start; end--)
+            {
+                if (!char.IsWhiteSpace(span[end]))
+                    break;
+            }
+            return span.Slice(start, end - start + 1);
         }
 
         /// <summary>
@@ -64,7 +76,19 @@ namespace System
         /// <param name="trimChar">The specified character to look for and remove.</param>
         public static ReadOnlySpan<char> Trim(this ReadOnlySpan<char> span, char trimChar)
         {
-            return span.TrimStart(trimChar).TrimEnd(trimChar);
+            int start = 0;
+            for (; start < span.Length; start++)
+            {
+                if (span[start] != trimChar)
+                    break;
+            }
+            int end = span.Length - 1;
+            for (; end >= start; end--)
+            {
+                if (span[end] != trimChar)
+                    break;
+            }
+            return span.Slice(start, end - start + 1);
         }
 
         /// <summary>