Производительность system.runtime.caching

Я сравнил производительность 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" имеет многочисленные ссылки. Если бы была какая-либо сериализация, включенная, то я понял бы, почему производительность отличается для этого объекта (как в распределенном кэшировании), но это оба незавершенные кэши, которые теоретически должны работать без многих существенных различий вообще.

27
задан Herber 14 July 2010 в 07:53
поделиться