From fcce9ab0e54e4580569ba4ed5be0f4e3ba4d37fa Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期二, 09 十二月 2025 17:12:02 +0800
Subject: [PATCH] 0312 优化字符串拼接 - 改名

---
 Assets/Launch/Utility/StringUtility.cs |  199 +++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 156 insertions(+), 43 deletions(-)

diff --git a/Assets/Launch/Utility/StringUtility.cs b/Assets/Launch/Utility/StringUtility.cs
index 72bd249..de0c656 100644
--- a/Assets/Launch/Utility/StringUtility.cs
+++ b/Assets/Launch/Utility/StringUtility.cs
@@ -2,88 +2,201 @@
 using System.Collections;
 using System.Text;
 using System;
+using System.Collections.Concurrent;
 
+
+// AI鎻愰啋瀹為檯鍦ㄧ幇浠g紪杈戝櫒涓紝浣庝簬4涓瓧绗︿覆鐨�+ 鎿嶄綔绗︾殑鎬ц兘鍜� string.Concat 鍑犱箮鐩稿悓锛屼細琚櫤鑳戒紭鍖栦负 string.Concat
 public class StringUtility
 {
     public static readonly string[] splitSeparator = new string[] { "|" };
 
+    // 瀵硅薄姹犳柟妗堬細绾跨▼瀹夊叏鐨凷tringBuilder姹�
+    private static readonly ConcurrentQueue<StringBuilder> _stringBuilderPool = new ConcurrentQueue<StringBuilder>();
+    private const int MAX_POOL_SIZE = 32;  // 澧炲姞姹犲ぇ灏忎互閫傚簲楂樺苟鍙�
+    private const int DEFAULT_CAPACITY = 64;
+    private const int SMALL_CAPACITY = 64;   // 閫傜敤浜庡皬瑙勬ā鎷兼帴
+    private const int TINY_CAPACITY = 32;    // 閫傜敤浜庢瀬灏忚妯℃嫾鎺�
+    private const int MEDIUM_CAPACITY = 128; // 鏂板涓瓑瀹归噺绾у埆
+    private const int LARGE_CAPACITY = 256;  // 鏂板澶у閲忕骇鍒�
 
-    // 鏂板锛氫负寰幆璋冪敤鐨勪紭鍖栫増鏈紙澶嶇敤StringBuilder锛�
-    [ThreadStatic]
-    private static StringBuilder _threadLocalStringBuilder;
-    
+
     /// <summary>
-    /// 鑾峰彇褰撳墠绾跨▼鐨凷tringBuilder
+    /// 鏅鸿兘瀹归噺浼扮畻锛堜紭鍖栫増锛�
     /// </summary>
-    private static StringBuilder GetThreadLocalStringBuilder()
+    private static int EstimateCapacity(params string[] objects)
     {
-        if (_threadLocalStringBuilder == null)
+        if (objects == null || objects.Length == 0)
+            return TINY_CAPACITY;
+
+        int totalLength = 0;
+
+        // 鍗曟閬嶅巻璁$畻鎬婚暱搴︼紝鎻愰珮鎬ц兘
+        foreach (string str in objects)
         {
-            _threadLocalStringBuilder = new StringBuilder();
+            if (str != null)
+                totalLength += str.Length;
         }
-        return _threadLocalStringBuilder;
+
+        // 鏇寸簿缁嗙殑瀹归噺绛栫暐锛屽噺灏戝唴瀛樻氮璐�
+        if (totalLength <= TINY_CAPACITY)
+            return TINY_CAPACITY;
+        else if (totalLength <= SMALL_CAPACITY)
+            return SMALL_CAPACITY;
+        else if (totalLength <= MEDIUM_CAPACITY)
+            return MEDIUM_CAPACITY;
+        else if (totalLength <= LARGE_CAPACITY)
+            return LARGE_CAPACITY;
+        else
+            // 瀵逛簬瓒呭ぇ瀛楃涓诧紝棰勭暀25%鐨勭紦鍐茬┖闂达紙鍑忓皯鍐呭瓨娴垂锛�
+            return totalLength + (totalLength >> 2);
     }
 
     /// <summary>
-    /// 鏅鸿兘瀛楃涓叉嫾鎺ユ柟娉曪紝鑷姩閫夋嫨鏈�浼樼瓥鐣�
-    /// - 2-4涓瓧绗︿覆锛氱洿鎺ヤ娇鐢� string.Concat() (鏈�楂樻�ц兘)
-    /// - 5涓互涓婂瓧绗︿覆锛氫娇鐢ㄧ嚎绋嬫湰鍦� StringBuilder 澶嶇敤 (寰幆浼樺寲)
+    /// 浠庡璞℃睜鑾峰彇StringBuilder
+    /// </summary>
+    private static StringBuilder GetPooledStringBuilder(int capacity = DEFAULT_CAPACITY)
+    {
+        if (_stringBuilderPool.TryDequeue(out StringBuilder sb))
+        {
+            sb.Clear();
+            // 濡傛灉瀹归噺涓嶈冻锛岄噸鏂板垱寤�
+            if (sb.Capacity < capacity)
+            {
+                sb = new StringBuilder(capacity);
+            }
+            return sb;
+        }
+        return new StringBuilder(capacity);
+    }
+
+    /// <summary>
+    /// 灏哠tringBuilder褰掕繕鍒板璞℃睜锛堜紭鍖栫増锛�
+    /// </summary>
+    private static void ReturnToPool(StringBuilder sb)
+    {
+        if (sb == null)
+            return;
+
+        // 瀹归噺杩囧ぇ鎴栬繃闀匡紝涓嶅洖鏀朵互閬垮厤鍐呭瓨闂
+        if (sb.Capacity > 2048 || sb.Length > 1024)
+        {
+            SecureClear(sb);
+            return;
+        }
+
+        // 姹犳湭婊℃椂鎵嶅洖鏀�
+        if (_stringBuilderPool.Count < MAX_POOL_SIZE)
+        {
+            sb.Clear();
+            _stringBuilderPool.Enqueue(sb);
+        }
+        else
+        {
+            // 姹犳弧鏃惰繘琛屽畨鍏ㄦ竻鐞�
+            SecureClear(sb);
+        }
+    }
+
+    /// <summary>
+    /// 瀹夊叏娓呯悊StringBuilder鍐呭锛堥槻姝㈡晱鎰熸暟鎹硠闇诧級
+    /// </summary>
+    private static void SecureClear(StringBuilder sb)
+    {
+        if (sb == null || sb.Length == 0)
+            return;
+
+        // 鍩虹娓呯悊
+        sb.Clear();
+
+        // 瀹夊叏娓呯悊锛氱敤绌哄瓧绗﹁鐩栫紦鍐插尯
+        // #if UNITY_EDITOR || DEVELOPMENT_BUILD
+        // // 浠呭湪寮�鍙戠増鏈腑鎵ц鏇村交搴曠殑娓呯悊锛岄伩鍏嶅奖鍝嶆�ц兘
+        // int originalCapacity = sb.Capacity;
+        // if (originalCapacity <= 1024) // 浠呭灏忓閲廠tringBuilder杩涜瀹夊叏娓呯悊
+        // {
+        //     sb.Capacity = originalCapacity;
+        //     for (int i = 0; i < originalCapacity; i++)
+        //     {
+        //         sb.Append('\0');
+        //     }
+        //     sb.Clear();
+        // }
+        // #endif
+    }
+
+    /// <summary>
+    /// 鏅鸿兘瀛楃涓叉嫾鎺ユ柟娉曪紙浼樺寲鐗堬級锛岃嚜鍔ㄩ�夋嫨鏈�浼樼瓥鐣�
+    /// - 1-4涓瓧绗︿覆锛氱洿鎺ヤ娇鐢� string.Concat() (鏈�楂樻�ц兘)
+    /// - 4-8涓瓧绗︿覆锛氫娇鐢ㄥ璞℃睜 StringBuilder锛屽閲忛鍒嗛厤
+    /// - 9涓互涓婂瓧绗︿覆锛氫娇鐢ㄥ璞℃睜 StringBuilder + 瀹归噺浼扮畻
     /// </summary>
     public static string Concat(params string[] _objects)
     {
+        if (_objects == null || _objects.Length == 0)
+            return string.Empty;
+
         // 灏戦噺瀛楃涓茬洿鎺ヤ娇鐢–oncat锛屾�ц兘鏈�浣�
         if (_objects.Length <= 4)
         {
             return string.Concat(_objects);
         }
 
-        // 澶ч噺瀛楃涓蹭娇鐢ㄧ嚎绋嬫湰鍦癝tringBuilder锛岄伩鍏嶉噸澶嶅垱寤�
-        var sb = GetThreadLocalStringBuilder();
-        sb.Clear();
-        foreach (string str in _objects)
+        // 涓瓑鏁伴噺瀛楃涓蹭娇鐢ㄧ畝鍗曞閲忕瓥鐣�
+        int estimatedCapacity;
+        if (_objects.Length <= 8)
         {
-            sb.Append(str);
+            estimatedCapacity = DEFAULT_CAPACITY;
         }
-        return sb.ToString();
-    }
-    
-    // AI鎻愰啋瀹為檯鍦ㄧ幇浠g紪杈戝櫒涓紝浣庝簬4涓瓧绗︿覆鐨�+ 鎿嶄綔绗︾殑鎬ц兘鍜� string.Concat 鍑犱箮鐩稿悓锛屼細琚櫤鑳戒紭鍖栦负 string.Concat
-    // 娣诲姞甯哥敤2涓瓧绗︿覆鎷兼帴鐨勪紭鍖栫増鏈�
-    public static string Contact(string str1, string str2)
-    {
-        return string.Concat(str1, str2);
-    }
-    
-    // 娣诲姞甯哥敤3涓瓧绗︿覆鎷兼帴鐨勪紭鍖栫増鏈�
-    public static string Contact(string str1, string str2, string str3)
-    {
-        return string.Concat(str1, str2, str3);
-    }
-    
-    // 娣诲姞甯哥敤4涓瓧绗︿覆鎷兼帴鐨勪紭鍖栫増鏈�
-    public static string Contact(string str1, string str2, string str3, string str4)
-    {
-        return string.Concat(str1, str2, str3, str4);
-    }
-   
+        else
+        {
+            // 澶ч噺瀛楃涓叉墠杩涜瀹归噺浼扮畻锛堜紭鍖栨�ц兘锛�
+            estimatedCapacity = EstimateCapacity(_objects);
+        }
 
-  
+        var sb = GetPooledStringBuilder(estimatedCapacity);
+        try
+        {
+            foreach (string str in _objects)
+            {
+                sb.Append(str);
+            }
+            return sb.ToString();
+        }
+        finally
+        {
+            ReturnToPool(sb);
+        }
+    }
 
 
     public static string FormatSpeed(float speed)
     {
         if (speed > 1048576f)
         {
-            return Contact((speed / 1048576f).ToString("f1"), " M/S");
+            return Concat((speed / 1048576f).ToString("f1"), " M/S");
         }
         else if (speed > 1024f)
         {
-            return Contact((speed / 1024f).ToString("f1"), " KB/S");
+            return Concat((speed / 1024f).ToString("f1"), " KB/S");
         }
         else
         {
-            return Contact(speed.ToString("f1"), " B/S");
+            return Concat(speed.ToString("f1"), " B/S");
         }
     }
 
+    /// <summary>
+    /// 棰勭儹瀵硅薄姹狅紙鍦ㄥ簲鐢ㄥ惎鍔ㄦ椂璋冪敤锛�
+    /// </summary>
+    public static void WarmupPool(int count = 4)
+    {
+        // 棰勭儹涓嶅悓瀹归噺鐨凷tringBuilder浠ラ�傚簲涓嶅悓鍦烘櫙
+        for (int i = 0; i < count && _stringBuilderPool.Count < MAX_POOL_SIZE; i++)
+        {
+            _stringBuilderPool.Enqueue(new StringBuilder(DEFAULT_CAPACITY));
+        }
+    }
+
+
+
 }

--
Gitblit v1.8.0