mirror of
https://github.com/GeWuYou/GFramework.git
synced 2026-03-22 10:34:30 +08:00
- 引入 PoolInfo 类来管理对象池的核心数据结构和统计信息 - 添加对象池容量限制功能,超过容量时自动销毁多余对象 - 实现对象池统计功能,跟踪创建、获取、释放、销毁等操作计数 - 新增 GetPoolSize 和 GetActiveCount 方法获取池状态信息 - 添加 SetMaxCapacity 方法设置池的最大容量限制 - 实现 Prewarm 功能用于预创建对象提高性能 - 提供 GetStatistics 方法获取详细的池统计信息 - 添加 IsExternalInit 支持旧版 .NET 框架的 init-only 属性 - 扩展 ArrayPool 添加便捷的扩展方法和自动释放功能 - 新增 StringBuilderPool 提供高性能的字符串构建器复用 - 完善单元测试覆盖新增的所有功能特性
112 lines
2.8 KiB
C#
112 lines
2.8 KiB
C#
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);
|
||
}
|
||
}
|
||
}
|