我比较了.NET 4.0中的system.runtime.caching和Enterprise Library Caching Block的性能,令我惊讶的是,在从缓存项获取大量数据集时,前者表现非常糟糕。
Enterprise Library在约0.15ms内获取100个对象,在约0.25ms内获取10000个对象。这很快,对于进程内缓存而言是自然的,因为实际上不需要复制任何数据(只需使用引用即可)。
.NET 4.0的缓存在约25ms内获取100个对象,在约1500ms内获取10000个对象!与Enterprise Library相比,这非常慢,这让我怀疑缓存是在进程外进行的。
我是否遗漏了某些配置选项,例如启用进程内缓存,还是Enterprise Library Caching Block确实快了这么多?
更新:
以下是我的基准测试:
首先,我从数据库加载数据到缓存中(与基准测试分开)。
我使用计时器来测量毫秒级别的get方法时间:
EnterpriseLibrary Caching
Enterprise Library在约0.15ms内获取100个对象,在约0.25ms内获取10000个对象。这很快,对于进程内缓存而言是自然的,因为实际上不需要复制任何数据(只需使用引用即可)。
.NET 4.0的缓存在约25ms内获取100个对象,在约1500ms内获取10000个对象!与Enterprise Library相比,这非常慢,这让我怀疑缓存是在进程外进行的。
我是否遗漏了某些配置选项,例如启用进程内缓存,还是Enterprise Library Caching Block确实快了这么多?
更新:
以下是我的基准测试:
首先,我从数据库加载数据到缓存中(与基准测试分开)。
我使用计时器来测量毫秒级别的get方法时间:
EnterpriseLibrary Caching
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”具有众多引用。如果涉及任何序列化(例如在分布式缓存中),我会理解为什么此对象的性能不同,但这两个都是进程内缓存,理论上应该没有太大的差异。
Stopwatch
类。 - SLaks