C# 这里正在使用本地缓存吗?为什么要进行如此缓慢的IEnumerable评估?

C# 这里正在使用本地缓存吗?为什么要进行如此缓慢的IEnumerable评估?,c#,caching,ienumerable,appfabric,C#,Caching,Ienumerable,Appfabric,在EAV模式中使用大约4600个对象,当序列化为单个集合时,大约140000个属性的总数小于25MB;不确定序列化时的确切大小(此处为4600个单独的缓存项) 为了解决EAV属性方案加载时间问题,我们尝试在启动时启动AppFabric,并依靠本地缓存。但是,当评估GetObjectsByTag或GetObjectsInRegion中的IEnumerable时,我发现性能非常差: var products = new Dictionary<string, ProductContract

在EAV模式中使用大约4600个对象,当序列化为单个集合时,大约140000个属性的总数小于25MB;不确定序列化时的确切大小(此处为4600个单独的缓存项)

为了解决EAV属性方案加载时间问题,我们尝试在启动时启动AppFabric,并依靠本地缓存。但是,当评估GetObjectsByTag或GetObjectsInRegion中的IEnumerable时,我发现性能非常差:

   var products = new Dictionary<string, ProductContract>();

   Trace.WriteLine(DateTime.Now.ToLongTimeString() + " retrieving object collection from cache");
   //object productsObj = _cache.Get(ProductCollectionNameInCache, this.CacheRegion);
   //var productsObjUneval = _cache.GetObjectsByTag(ProductCacheTag, this.CacheRegion);
   var productsObjUneval = _cache.GetObjectsInRegion(this.CacheRegion);
   Trace.WriteLine(DateTime.Now.ToLongTimeString() + " retrieving object collection from cache complete");

   Trace.WriteLine(DateTime.Now.ToLongTimeString() + " evaluating IEnumerable object");
   var productsObj = productsObjUneval.Where(p=>p.Key != ProductsPrimedFlagNameInCache).ToList();
   Trace.WriteLine(DateTime.Now.ToLongTimeString() + " end evaluating IEnumerable object");

   Trace.WriteLine(DateTime.Now.ToLongTimeString() + " converting object collection to Dictionary<string, ProductContract>");
   products = productsObj.ToDictionary(p => p.Key, p => (ProductContract) p.Value);
   Trace.WriteLine(DateTime.Now.ToLongTimeString() + " end converting object collection to Dictionary<string, ProductContract>");
var products=newdictionary();
Trace.WriteLine(DateTime.Now.ToLongTimeString()+“从缓存中检索对象集合”);
//对象productsObj=\u cache.Get(ProductCollectionNameInCache,this.CacheRegion);
//var productsObjUneval=_cache.GetObjectsByTag(ProductCacheTag,this.CacheRegion);
var productsObjUneval=\u cache.GetObjectsInRegion(this.CacheRegion);
Trace.WriteLine(DateTime.Now.ToLongTimeString()+“从缓存中检索对象集合完成”);
Trace.WriteLine(DateTime.Now.ToLongTimeString()+“评估IEnumerable对象”);
var productsObj=productsObjUneval.Where(p=>p.Key!=ProductsPrimedFlagNameInCache.ToList();
Trace.WriteLine(DateTime.Now.ToLongTimeString()+“结束对IEnumerable对象的求值”);
Trace.WriteLine(DateTime.Now.ToLongTimeString()+“将对象集合转换为字典”);
products=productsObj.ToDictionary(p=>p.Key,p=>(ProductContract)p.Value);
Trace.WriteLine(DateTime.Now.ToLongTimeString()+“结束将对象集合转换为字典”);
事件日志输出:

Level   Date and Time   Source  Event ID    Task Category
Information 4/27/2011 12:55:22 PM   EPC Service 0   None    12:55:22 PM end getting products from cache
Information 4/27/2011 12:55:22 PM   EPC Service 0   None    12:55:22 PM end converting object collection to Dictionary<string, ProductContract>
Information 4/27/2011 12:55:22 PM   EPC Service 0   None    12:55:22 PM converting object collection to Dictionary<string, ProductContract>
Information 4/27/2011 12:55:22 PM   EPC Service 0   None    12:55:22 PM end evaluating IEnumerable object
Information 4/27/2011 12:55:05 PM   EPC Service 0   None    12:55:05 PM evaluating IEnumerable object
Information 4/27/2011 12:55:05 PM   EPC Service 0   None    12:55:05 PM retrieving object collection from cache complete
Information 4/27/2011 12:55:05 PM   EPC Service 0   None    12:55:05 PM retrieving object collection from cache
Information 4/27/2011 12:55:05 PM   EPC Service 0   None    12:55:05 PM getting products from cache
Information 4/27/2011 12:55:05 PM   EPC Service 0   None    12:55:05 PM is cache primed? True
级别日期和时间源事件ID任务类别
信息2011年4月27日12:55:22下午EPC服务0无12:55:22下午结束从缓存获取产品
信息2011年4月27日12:55:22 PM EPC服务0无12:55:22 PM结束将对象集合转换为字典
信息2011年4月27日12:55:22 PM EPC服务0无12:55:22 PM将对象集合转换为字典
信息2011年4月27日12:55:22下午EPC服务0无12:55:22下午结束评估IEnumerable对象
信息2011年4月27日下午12:55:05 EPC服务0无12:55:05评估IEnumerable对象
信息2011年4月27日下午12:55:05 EPC服务0无下午12:55:05从缓存检索对象集合完成
信息2011年4月27日下午12:55:05 EPC服务0无下午12:55:05从缓存检索对象集合
信息2011年4月27日下午12:55:05 EPC服务0无下午12:55:05从缓存获取产品
信息2011年4月27日12:55:05 PM EPC服务0无12:55:05 PM缓存是否已启动?符合事实的

编辑:按标记调用所有对象,或区域中的所有对象,是否总是与分布式缓存而不是本地缓存相冲突?这将是非常令人失望的,对我们的需要完全无用

不确定,因为我不知道底层实现,但是.ToList()对我来说似乎很可疑。这将遍历整个枚举。有必要吗?直接转到ToDictionary()怎么样?

不确定,因为我不知道底层实现,但是.ToList()对我来说似乎很可疑。这将遍历整个枚举。有必要吗?直接转到ToDictionary()怎么样?

顺便说一句,这可能只是延迟了ToDictionary()调用的速度。这是基本的.NET.ToList,只是为了将IEnumerable求值与ToDictionary转换隔离开来,以便进行分析。ToList最初不在那里,是的,这种延迟最初是在调用.ToDictionary时看到的。您通过探查器运行过吗?这听起来像是在处理以下其中一种的慢度:-键或值访问器-枚举器MoveNext()调用谢谢,但这不是问题所在。当然,我在发布here.BTW之前已经分析过了,这可能只是延迟了ToDictionary()调用的速度。这是basic.NET.ToList,只是为了将IEnumerable求值与ToDictionary转换隔离开来,以便进行分析。ToList最初不在那里,是的,这种延迟最初是在调用.ToDictionary时看到的。您通过探查器运行过吗?这听起来像是在处理以下其中一种的慢度:-键或值访问器-枚举器MoveNext()调用谢谢,但这不是问题所在。当然,我在这里发布之前也做了简要介绍。