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