gpt4 book ai didi

.net - system.runtime.caching 的性能

转载 作者:行者123 更新时间:2023-12-02 07:36:43 25 4
gpt4 key购买 nike

我比较了 .NET 4.0 中的 system.runtime.caching 和企业库缓存 block 的性能,令我惊讶的是,在从缓存项获取大型数据集合时,它的性能表现非常糟糕。

企业库在大约 0.15 毫秒内获取 100 个对象,在大约 0.25 毫秒内获取 10000 个对象。对于进程内缓存来说,这是快速且自然的,因为实际上不需要复制数据(仅引用)。

.NET 4.0 缓存在大约 25 毫秒内获取 100 个对象,在大约 1500 毫秒内获取 10000 个对象!相比之下,这非常慢,这让我怀疑缓存是在进程外完成的。

我是否缺少一些配置选项,例如启用进程内缓存,或者企业库缓存 block 真的这么快吗?

更新

这是我的基准:

首先,我将数据从数据库加载到缓存(与基准测试分开)。

我在 get 方法周围使用计时器来测量时间(以毫秒为单位):

企业库缓存

Microsoft.Practices.EnterpriseLibrary.Caching.CacheManager _cache;

public void InitCache(){
_cache = CacheFactory.GetCacheManager("myCacheName");
}

public void Benchmark(){
HighPerformanceTimer timer = new HighPerformanceTimer();
timer.Start();
myObject o = (myObject)_cache.GetData(myCacheKey);
timer.Stop();
Response.Write(timer.GetAsStringInMilliseconds());
}

.NET 4.0 缓存

    System.Runtime.Caching.MemoryCache _cache;

public void InitCache(){
_cache = new MemoryCache("myCacheName");
}

public void Benchmark(){
HighPerformanceTimer timer = new HighPerformanceTimer();
timer.Start();
myObject o = (myObject)_cache.Get(myCacheKey);
timer.Stop();
Response.Write(timer.GetAsStringInMilliseconds());
}

基准测试会执行 1000 次,以计算获取对象的平均时间,以确保测试的可靠性。计时器是我使用的自定义计时器,任何计数毫秒的计时器都可以。

有趣的是“myObject”有很多引用。如果涉及任何序列化,我会理解为什么该对象的性能有所不同(例如在分布式缓存中),但这些都是进程内缓存,理论上应该可以正常工作,根本没有太大差异。

最佳答案

我的猜测是你们的缓存内容或策略的详细信息不一样。在没有看到设置或插入的情况下,很难确切地说出如何进行。

无论如何,这两个库具有不同的性能特征,哪个更好显然取决于具体情况。

可能我的测试(下面的代码)太简单而无法具有代表性,但在我的机器上运行它时,MemoryCache 大约快了 10 倍

class Program
{
const string myCacheKey = "foo";
static ICacheManager _elCache;
static MemoryCache _rtCache;
public static void InitCache()
{
_elCache = CacheFactory.GetCacheManager();
_elCache.Add(myCacheKey, new object());

_rtCache = new MemoryCache("cache");
_rtCache.Add(myCacheKey, new object(), new CacheItemPolicy());
}
public static string ElBenchmark(int n)
{
Stopwatch timer = new Stopwatch();
timer.Start();
for (int i = 0; i < n; i++)
{
object o = _elCache.GetData(myCacheKey);
}
timer.Stop();
return timer.ElapsedTicks.ToString();
}
public static string RtBenchmark(int n)
{
Stopwatch timer = new Stopwatch();
timer.Start();
for (int i = 0; i < n; i++)
{
object o = _rtCache.Get(myCacheKey);
}
timer.Stop();
return timer.ElapsedTicks.ToString();
}
static void Main(string[] args)
{
while (true)
{
InitCache();
StringBuilder sb = new StringBuilder();
System.Diagnostics.Debug.Write("EL: " + ElBenchmark(10000));
System.Diagnostics.Debug.Write("\t");
System.Diagnostics.Debug.Write("RT: " + RtBenchmark(10000));
System.Diagnostics.Debug.Write("\r\n");
}
}
}


<?xml version="1.0"?>
<configuration>

<configSections>
<section name="cachingConfiguration"
type="Microsoft.Practices.EnterpriseLibrary.Caching.Configuration.CacheManagerSettings, Microsoft.Practices.EnterpriseLibrary.Caching, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="true" />
</configSections>
<cachingConfiguration defaultCacheManager="MyCacheManager">
<cacheManagers>
<add name="MyCacheManager" type="Microsoft.Practices.EnterpriseLibrary.Caching.CacheManager, Microsoft.Practices.EnterpriseLibrary.Caching, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
expirationPollFrequencyInSeconds="60"
maximumElementsInCacheBeforeScavenging="50000"
numberToRemoveWhenScavenging="1000"
backingStoreName="NullBackingStore" />
</cacheManagers>
<backingStores>
<add type="Microsoft.Practices.EnterpriseLibrary.Caching.BackingStoreImplementations.NullBackingStore, Microsoft.Practices.EnterpriseLibrary.Caching, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
name="NullBackingStore" />
</backingStores>
</cachingConfiguration>

<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
</configuration>

关于.net - system.runtime.caching 的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3157340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com