GFramework/GFramework.Core/pool/StringBuilderPool.cs
GeWuYou eb763a9bc4 feat(pool): 重构对象池系统增加统计和容量控制功能
- 引入 PoolInfo 类来管理对象池的核心数据结构和统计信息
- 添加对象池容量限制功能,超过容量时自动销毁多余对象
- 实现对象池统计功能,跟踪创建、获取、释放、销毁等操作计数
- 新增 GetPoolSize 和 GetActiveCount 方法获取池状态信息
- 添加 SetMaxCapacity 方法设置池的最大容量限制
- 实现 Prewarm 功能用于预创建对象提高性能
- 提供 GetStatistics 方法获取详细的池统计信息
- 添加 IsExternalInit 支持旧版 .NET 框架的 init-only 属性
- 扩展 ArrayPool 添加便捷的扩展方法和自动释放功能
- 新增 StringBuilderPool 提供高性能的字符串构建器复用
- 完善单元测试覆盖新增的所有功能特性
2026-02-25 20:40:02 +08:00

112 lines
2.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Text;
namespace GFramework.Core.pool;
/// <summary>
/// StringBuilder 对象池,提供高性能的字符串构建器复用
/// </summary>
public static class StringBuilderPool
{
private const int DefaultCapacity = 256;
private const int MaxRetainedCapacity = 4096;
/// <summary>
/// 从池中租用一个 StringBuilder
/// </summary>
/// <param name="capacity">初始容量,默认为 256</param>
/// <returns>StringBuilder 实例</returns>
/// <example>
/// <code>
/// var sb = StringBuilderPool.Rent();
/// try
/// {
/// sb.Append("Hello");
/// sb.Append(" World");
/// return sb.ToString();
/// }
/// finally
/// {
/// StringBuilderPool.Return(sb);
/// }
/// </code>
/// </example>
public static StringBuilder Rent(int capacity = DefaultCapacity)
{
var sb = new StringBuilder(capacity);
return sb;
}
/// <summary>
/// 将 StringBuilder 归还到池中
/// </summary>
/// <param name="builder">要归还的 StringBuilder</param>
/// <example>
/// <code>
/// var sb = StringBuilderPool.Rent();
/// try
/// {
/// sb.Append("Hello World");
/// Console.WriteLine(sb.ToString());
/// }
/// finally
/// {
/// StringBuilderPool.Return(sb);
/// }
/// </code>
/// </example>
public static void Return(StringBuilder builder)
{
ArgumentNullException.ThrowIfNull(builder);
// 如果容量过大,不放回池中
if (builder.Capacity > MaxRetainedCapacity)
{
return;
}
builder.Clear();
}
/// <summary>
/// 获取一个 StringBuilder使用完后自动归还
/// </summary>
/// <param name="capacity">初始容量</param>
/// <returns>可自动释放的 StringBuilder 包装器</returns>
/// <example>
/// <code>
/// using var sb = StringBuilderPool.GetScoped();
/// sb.Value.Append("Hello");
/// sb.Value.Append(" World");
/// return sb.Value.ToString();
/// </code>
/// </example>
public static ScopedStringBuilder GetScoped(int capacity = DefaultCapacity)
{
return new ScopedStringBuilder(Rent(capacity));
}
/// <summary>
/// 可自动释放的 StringBuilder 包装器
/// </summary>
public readonly struct ScopedStringBuilder : IDisposable
{
/// <summary>
/// 获取 StringBuilder 实例
/// </summary>
public StringBuilder Value { get; }
internal ScopedStringBuilder(StringBuilder value)
{
Value = value;
}
/// <summary>
/// 释放 StringBuilder 并归还到池中
/// </summary>
public void Dispose()
{
Return(Value);
}
}
}