Я сравнил производительность system.runtime.caching в.NET 4.0 и Библиотека Предприятия, Кэширующая Блок, и к моему удивлению это работает ужасно в сравнении при выборке больших сборов данных от объектов кэша.
Библиотека предприятия выбирает 100 объектов приблизительно в 0,15 мс, 10 000 объектов приблизительно в 0,25 мс. Это быстро, и естественно для незавершенного кэша, потому что никакие данные на самом деле не должны быть скопированы (только ссылки).
.NET 4,0 кэширующихся выборки 100 объектов приблизительно в 25 мс, 10 000 объектов приблизительно в 1 500 мс! Это ужасно медленно в сравнении, и оно заставляет меня подозревать, что кэширование сделано из процесса.
Я пропускаю некоторый параметр конфигурации, например, для включения незавершенного кэширования, или Библиотека Предприятия Кэширует Блок действительно это намного быстрее?
Обновление
Вот мой сравнительный тест:
Во-первых, я загружаю данные от базы данных до кэша (отдельный от сравнительного теста).
Я использую таймер вокруг получить методов для измерения времени в миллисекундах:
Кэширование 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" имеет многочисленные ссылки. Если бы была какая-либо сериализация, включенная, то я понял бы, почему производительность отличается для этого объекта (как в распределенном кэшировании), но это оба незавершенные кэши, которые теоретически должны работать без многих существенных различий вообще.