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