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