He comparado el rendimiento de system.runtime.caching en .NET 4.0 y Enterprise Library Caching Block y, para mi sorpresa, tiene un rendimiento terrible en comparación cuando se obtienen grandes colecciones de datos de elementos de caché.Rendimiento de system.runtime.caching
Enterprise Library obtiene 100 objetos en aproximadamente 0,15ms, 10000 objetos en aproximadamente 0,25ms. Esto es rápido y natural para una memoria caché en proceso porque en realidad no es necesario copiar datos (solo referencias).
¡El caché de .NET 4.0 obtiene 100 objetos en aproximadamente 25 ms, 10000 objetos en aproximadamente 1500 ms! Esto es terriblemente lento en comparación y me hace sospechar que el almacenamiento en caché se realiza fuera de proceso.
¿Se está perdiendo alguna opción de configuración, por ejemplo, para habilitar el almacenamiento en memoria caché en proceso, o el Enterprise Library Caching Block realmente es mucho más rápido?
actualización
Aquí está mi punto de referencia:
En primer lugar, cargar los datos de la base de datos en la memoria caché (separada de la referencia).
debo utilizar un temporizador en torno a los métodos get para medir el tiempo en milisegundos:
EnterpriseLibrary almacenamiento en caché
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 Almacenamiento en caché
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());
}
El punto de referencia es ejecutado 1000 veces para calcular el tiempo promedio para buscar el objeto para asegurar confiabilidad de la prueba. El temporizador es un temporizador personalizado que uso, cualquier temporizador que milisegundos debe hacer.
Lo interesante es que el "myObject" tiene numerosas referencias. Si hubiera alguna serialización involucrada, entendería por qué el rendimiento difiere para este objeto (como en el almacenamiento en caché distribuido), pero estas son cachés en proceso que teóricamente deberían funcionar sin muchas diferencias importantes.
¿Está utilizando MemoryCache o comparó su propia implementación? De acuerdo con msdn MemoryCache es inproc. – ata
Estoy usando MemoryCache, sin configuraciones específicas. – Herber
¿Puede mostrarnos su punto de referencia? –