2010-07-01 8 views
28

मैंने .NET 4.0 और एंटरप्राइज़ लाइब्रेरी कैशिंग ब्लॉक में system.runtime.caching के प्रदर्शन की तुलना की है और मेरे आश्चर्य से यह कैश आइटम्स से बड़े डेटा संग्रह प्राप्त करते समय तुलना में बहुत अधिक प्रदर्शन करता है।system.runtime.caching का प्रदर्शन

एंटरप्राइज़ लाइब्रेरी लगभग 0,15ms, 10000 ऑब्जेक्ट्स में लगभग 0,25ms में 100 ऑब्जेक्ट्स प्राप्त करती है। यह एक प्रक्रिया में कैश के लिए तेज़ और प्राकृतिक है क्योंकि वास्तव में कोई डेटा कॉपी करने की आवश्यकता नहीं है (केवल संदर्भ)।

.NET 4.0 कैशिंग लगभग 2500 में 100 ऑब्जेक्ट्स प्राप्त करता है, 10000 ऑब्जेक्ट्स लगभग 1500ms में! तुलना में यह बहुत धीमी है और इससे मुझे संदेह होता है कि कैशिंग को प्रक्रिया से बाहर किया जाता है।

क्या मुझे कुछ कॉन्फ़िगरेशन विकल्प याद आ रहा है, उदाहरण के लिए इन-प्रोसेस कैशिंग सक्षम करने के लिए, या एंटरप्राइज़ लाइब्रेरी कैशिंग ब्लॉक वास्तव में यह बहुत तेज है?

अद्यतन

यहाँ मेरी बेंचमार्क है:

पहले, मैं कैश (बेंचमार्क से अलग) के लिए डेटाबेस से डेटा लोड।

मैं तरीकों के चारों ओर एक टाइमर का उपयोग मिलीसेकेंड में समय को मापने के लिए:

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

बेंचमार्क है ऑब्जेक्ट को सुनिश्चित करने के लिए औसत समय की गणना करने के लिए 1000 बार निष्पादित किया गया परीक्षण की विश्वसनीयता। टाइमर एक कस्टम टाइमर है जिसका उपयोग मैं करता हूं, किसी भी टाइमर गिनती मिलीसेकंड करना चाहिए।

दिलचस्प बात यह है कि "myObject" में कई संदर्भ हैं। यदि कोई धारावाहिक शामिल था तो मैं समझूंगा कि इस ऑब्जेक्ट के लिए प्रदर्शन अलग क्यों है (जैसे वितरित कैशिंग में), लेकिन ये इन-प्रोसेस कैश दोनों हैं जो सैद्धांतिक रूप से बिना किसी बड़े अंतर के काम करना चाहिए।

+0

क्या आप मेमोरी कैश का उपयोग कर रहे हैं या अपने स्वयं के कार्यान्वयन का बेंचमार्क किया है? एमएसडीएन के अनुसार मेमोरी कैश असुरक्षित है। – ata

+0

मैं किसी भी विशिष्ट विन्यास के बिना मेमोरी कैश का उपयोग कर रहा हूं। – Herber

+0

क्या आप हमें अपना बेंचमार्क दिखा सकते हैं? –

उत्तर

8

मेरा अनुमान है कि आपके कैश सामग्री या नीतियों का विवरण समान नहीं है। सेटअप, या आवेषण को देखे बिना, यह कहना मुश्किल है कि कैसे।

भले ही, दोनों पुस्तकालयों में अलग-अलग प्रदर्शन विशेषताएं हों, और कौन सा बेहतर स्पष्ट रूप से स्थिति पर निर्भर करता है।

शायद मेरा परीक्षण (नीचे कोड) प्रतिनिधि होने के लिए बहुत आसान है, लेकिन यह मेरी मशीन पर चल रहा है, मेमोरी कैश लगभग 10x तेज है।

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> 
संबंधित मुद्दे