2010-07-01 5 views
28

.NET 4.0 및 Enterprise Library Caching Block에서 system.runtime.caching의 성능을 비교했으며 캐시 항목에서 큰 데이터 컬렉션을 가져올 때 비교할 때 놀랍게도 성능이 놀랍습니다.performance of system.runtime.caching

엔터프라이즈 라이브러리는 약 0.15ms 간격으로 100 개의 개체를 가져오고 약 0.25ms 간격으로 10000 개의 개체를 가져옵니다. 실제로 데이터를 복사 할 필요가 없으므로 (참조 만) 인 프로세스 캐시의 경우 빠르고 빠릅니다.

.NET 4.0 캐싱은 약 25ms 동안 100 개의 개체를 가져오고, 약 1500ms에 10000 개의 개체를 가져옵니다. 이것은 비교가 매우 느리며 캐시가 out-of-process로 처리되었다고 생각됩니다.

일부 구성 옵션이 누락 되었습니까? 예를 들어 in-process 캐싱을 사용하고 있습니까? 아니면 Enterprise Library Caching Block이 실제로 훨씬 빠릅니까?

업데이트

여기 내 벤치 마크 :

는 첫째, 캐시 (벤치 마크에서 분리)에 대한 데이터베이스에서 데이터를로드가.

EnterpriseLibrary 캐싱

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()); 
    } 

입니다 캐싱 :

나는 밀리 초 단위로 시간을 측정하기 위해 get 메소드 주위에 타이머를 사용 1000 번 실행하여 평균 시간을 계산하여 개체를 가져 와서 보장합니다. 테스트의 신뢰성. 타이머는 내가 사용하는 맞춤 타이머이며, 밀리 초를 계산하는 모든 타이머가 수행해야합니다.

재미있는 점은 "myObject"에 수많은 참조가 있다는 것입니다. 직렬화가 관련된 경우 분산 캐시와 같이이 개체의 성능이 왜 다른지 이해할 수 있습니다.하지만이 두 프로세스 캐시는 이론적으로 많은 주요 차이점없이 작동해야합니다.

+0

MemoryCache를 사용하고 있습니까? 아니면 자신의 구현을 벤치마킹 했습니까? msdn MemoryCache에 따르면 inproc입니다. – ata

+0

특정 구성없이 MemoryCache를 사용하고 있습니다. – Herber

+0

벤치 마크를 보여줄 수 있습니까? –

답변

8

내 생각에 캐시 내용이나 정책의 세부 사항이 동일하지 않습니다. 셋업이나 인서트를 보지 않고서 어떻게 정확하게 말하기는 어렵습니다.

두 라이브러리는 성능 특성이 다르며 상황에 따라 명확하게 구분됩니다.

아마 내 테스트 (아래 코드)가 너무 단순해서 대표적 일 수는 없지만 내 컴퓨터에서 실행중인 경우 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>