perf: 异步池化性能

This commit is contained in:
2248356998 qq.com
2025-10-20 20:32:31 +08:00
parent 516fd7f235
commit 835e3e4114
4 changed files with 17 additions and 49 deletions

View File

@@ -27,7 +27,7 @@ internal class CacheManager
{
private IMemoryCache Cache { get; set; }
private IServiceProvider Provider { get; set; }
private static IServiceProvider Provider => App.RootServices;
[NotNull]
private static CacheManager? Instance { get; set; }
@@ -40,8 +40,7 @@ internal class CacheManager
static CacheManager()
{
Instance = new();
Instance.Provider = App.RootServices;
Instance.Cache = Instance.Provider.GetRequiredService<IMemoryCache>();
Instance.Cache = Provider.GetRequiredService<IMemoryCache>();
Options = App.RootServices.GetRequiredService<IOptions<BootstrapBlazorOptions>>().Value;
}
@@ -236,7 +235,7 @@ internal class CacheManager
/// <returns></returns>
public static IStringLocalizer? CreateLocalizerByType(Type resourceSource) => resourceSource.Assembly.IsDynamic
? null
: Instance.Provider.GetRequiredService<IStringLocalizerFactory>().Create(resourceSource);
: Provider.GetRequiredService<IStringLocalizerFactory>().Create(resourceSource);
/// <summary>
/// 获得 <see cref="JsonLocalizationOptions"/> 值
@@ -244,7 +243,7 @@ internal class CacheManager
/// <returns></returns>
private static JsonLocalizationOptions GetJsonLocalizationOption()
{
var localizationOptions = Instance.Provider.GetRequiredService<IOptions<JsonLocalizationOptions>>();
var localizationOptions = Provider.GetRequiredService<IOptions<JsonLocalizationOptions>>();
return localizationOptions.Value;
}
/// <summary>
@@ -253,7 +252,7 @@ internal class CacheManager
/// <returns></returns>
private static BootstrapBlazorOptions GetBootstrapBlazorOption()
{
var localizationOptions = Instance.Provider.GetRequiredService<IOptions<BootstrapBlazorOptions>>();
var localizationOptions = Provider.GetRequiredService<IOptions<BootstrapBlazorOptions>>();
return localizationOptions.Value;
}
/// <summary>
@@ -269,7 +268,7 @@ internal class CacheManager
return null;
}
IStringLocalizer? ret = null;
var factories = Instance.Provider.GetServices<IStringLocalizerFactory>();
var factories = Provider.GetServices<IStringLocalizerFactory>();
var factory = factories.LastOrDefault(a => a is not JsonStringLocalizerFactory);
if (factory != null)
{
@@ -345,7 +344,7 @@ internal class CacheManager
/// <param name="typeName"></param>
/// <param name="includeParentCultures"></param>
/// <returns></returns>
public static IEnumerable<LocalizedString> GetTypeStringsFromResolve(string typeName, bool includeParentCultures = true) => Instance.Provider.GetRequiredService<ILocalizationResolve>().GetAllStringsByType(typeName, includeParentCultures);
public static IEnumerable<LocalizedString> GetTypeStringsFromResolve(string typeName, bool includeParentCultures = true) => Provider.GetRequiredService<ILocalizationResolve>().GetAllStringsByType(typeName, includeParentCultures);
#endregion
#region DisplayName

View File

@@ -25,17 +25,11 @@ public class ObjectPoolLock<T> : DisposeBase, IPool<T> where T : class
/// <summary>最大个数。默认00表示无上限</summary>
public Int32 Max { get; set; } = 0;
/// <summary>最小个数。默认1</summary>
public Int32 Min { get; set; } = 1;
private readonly object _syncRoot = new();
/// <summary>基础空闲集合。只保存最小个数,最热部分</summary>
private readonly Stack<T> _free = new();
/// <summary>扩展空闲集合。保存最小个数以外部分</summary>
private readonly Queue<T> _free2 = new();
/// <summary>借出去的放在这</summary>
private readonly HashSet<T> _busy = new();
@@ -79,7 +73,7 @@ public class ObjectPoolLock<T> : DisposeBase, IPool<T> where T : class
if (_inited) return;
_inited = true;
WriteLog($"Init {typeof(T).FullName} Min={Min} Max={Max}");
WriteLog($"Init {typeof(T).FullName} Max={Max}");
}
}
#endregion
@@ -99,26 +93,20 @@ public class ObjectPoolLock<T> : DisposeBase, IPool<T> where T : class
pi = _free.Pop();
_FreeCount--;
}
else if (_free2.Count > 0)
{
pi = _free2.Dequeue();
_FreeCount--;
}
else
{
var count = BusyCount;
if (Max > 0 && count >= Max)
if (Max > 0 && BusyCount >= Max)
{
var msg = $"申请失败,已有 {count:n0} 达到或超过最大值 {Max:n0}";
var msg = $"申请失败,已有 {BusyCount:n0} 达到或超过最大值 {Max:n0}";
WriteLog("Acquire Max " + msg);
throw new Exception(Name + " " + msg);
}
pi = OnCreate();
if (count == 0) Init();
if (BusyCount == 0) Init();
#if DEBUG
WriteLog("Acquire Create Free={0} Busy={1}", FreeCount, count + 1);
WriteLog("Acquire Create Free={0} Busy={1}", FreeCount, BusyCount + 1);
#endif
}
}
@@ -177,10 +165,7 @@ public class ObjectPoolLock<T> : DisposeBase, IPool<T> where T : class
}
lock (_syncRoot)
{
if (_FreeCount < Min)
_free.Push(value);
else
_free2.Enqueue(value);
_free.Push(value);
_FreeCount++;
}
@@ -214,12 +199,6 @@ public class ObjectPoolLock<T> : DisposeBase, IPool<T> where T : class
OnDispose(pi);
}
while (_free2.Count > 0)
{
var pi = _free2.Dequeue();
OnDispose(pi);
}
_FreeCount = 0;
foreach (var item in _busy)

View File

@@ -12,18 +12,13 @@ namespace PooledAwait
{
private static ObjectPoolLock<T> pool = new();
[ThreadStatic]
private static T? ts_local;
/// <summary>
/// Gets an instance from the pool if possible
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static T? TryGet()
{
var tmp = ts_local;
ts_local = null;
return tmp ?? pool.Get();
return pool.Get();
}
/// <summary>
@@ -34,11 +29,6 @@ namespace PooledAwait
{
if (value != null)
{
if (ts_local == null)
{
ts_local = value;
return;
}
pool.Return(value);
}
}

View File

@@ -1,9 +1,9 @@
<Project>
<PropertyGroup>
<PluginVersion>10.11.116</PluginVersion>
<ProPluginVersion>10.11.116</ProPluginVersion>
<DefaultVersion>10.11.116</DefaultVersion>
<PluginVersion>10.11.117</PluginVersion>
<ProPluginVersion>10.11.117</ProPluginVersion>
<DefaultVersion>10.11.117</DefaultVersion>
<AuthenticationVersion>10.11.6</AuthenticationVersion>
<SourceGeneratorVersion>10.11.6</SourceGeneratorVersion>
<NET8Version>8.0.21</NET8Version>