This is an automated email from the ASF dual-hosted git repository.

nightowl888 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/lucenenet.git

commit 1d74f980a0aaba980c9c79e4cf8fd70b0917ef35
Author: Shad Storhaug <[email protected]>
AuthorDate: Fri Oct 28 12:02:56 2022 +0700

    PERFORMANCE: Lucene.Net.Analysis.Util.OpenStringBuilder: Added overloads of 
UnsafeWrite() for string an ICharSequence. Optimized Append() methods to call 
UnsafeWrite with index and count to optimize the operation depending on the 
type of object passed.
---
 .../Analysis/Util/OpenStringBuilder.cs             | 54 +++++++++++++++-------
 1 file changed, 38 insertions(+), 16 deletions(-)

diff --git a/src/Lucene.Net.Analysis.Common/Analysis/Util/OpenStringBuilder.cs 
b/src/Lucene.Net.Analysis.Common/Analysis/Util/OpenStringBuilder.cs
index 90718612b..ad2f687a2 100644
--- a/src/Lucene.Net.Analysis.Common/Analysis/Util/OpenStringBuilder.cs
+++ b/src/Lucene.Net.Analysis.Common/Analysis/Util/OpenStringBuilder.cs
@@ -82,10 +82,7 @@ namespace Lucene.Net.Analysis.Util
         public virtual OpenStringBuilder Append(ICharSequence csq, int 
startIndex, int count) // LUCENENET specific: changed to startIndex/length to 
match .NET
         {
             EnsureCapacity(count);
-            for (int i = startIndex; i < startIndex + count; i++)
-            {
-                UnsafeWrite(csq[i]);
-            }
+            UnsafeWrite(csq, startIndex, count);
             return this;
         }
 
@@ -99,10 +96,7 @@ namespace Lucene.Net.Analysis.Util
         public virtual OpenStringBuilder Append(string csq, int startIndex, 
int count) // LUCENENET specific: changed to startIndex/length to match .NET
         {
             EnsureCapacity(count);
-            for (int i = startIndex; i < startIndex + count; i++)
-            {
-                UnsafeWrite(csq[i]);
-            }
+            UnsafeWrite(csq, startIndex, count);
             return this;
         }
 
@@ -116,10 +110,7 @@ namespace Lucene.Net.Analysis.Util
         public virtual OpenStringBuilder Append(StringBuilder csq, int 
startIndex, int count) // LUCENENET specific: changed to startIndex/length to 
match .NET
         {
             EnsureCapacity(count);
-            for (int i = startIndex; i < startIndex + count; i++)
-            {
-                UnsafeWrite(csq[i]);
-            }
+            UnsafeWrite(csq, startIndex, count);
             return this;
         }
 
@@ -134,10 +125,7 @@ namespace Lucene.Net.Analysis.Util
         public virtual OpenStringBuilder Append(char[] value, int startIndex, 
int count)
         {
             EnsureCapacity(count);
-            for (int i = startIndex; i < startIndex + count; i++)
-            {
-                UnsafeWrite(value[i]);
-            }
+            UnsafeWrite(value, startIndex, count);
             return this;
         }
 
@@ -210,6 +198,40 @@ namespace Lucene.Net.Analysis.Util
             this.m_len += len;
         }
 
+        // LUCENENET specific overload for string
+        public virtual void UnsafeWrite(string b, int off, int len)
+        {
+            b.CopyTo(off, m_buf, this.m_len, len);
+            this.m_len += len;
+        }
+
+        // LUCENENET specific overload for ICharSequence
+        public virtual void UnsafeWrite(ICharSequence b, int off, int len)
+        {
+            if (!b.HasValue) return;
+
+            if (b is StringBuilderCharSequence sb)
+            {
+                UnsafeWrite(sb.Value, off, len);
+                return;
+            }
+            if (b is StringCharSequence str)
+            {
+                UnsafeWrite(str.Value, off, len);
+                return;
+            }
+            if (b is CharArrayCharSequence chars)
+            {
+                UnsafeWrite(chars.Value, off, len);
+                return;
+            }
+
+            for (int i = off; i < off + len; i++)
+            {
+                UnsafeWrite(b[i]);
+            }
+        }
+
         protected virtual void Resize(int len)
         {
             char[] newbuf = new char[Math.Max(m_buf.Length << 1, len)];

Reply via email to