我在CodeFluent中出现了内存泄漏问题,因为对象的ListCollections均衡器维护了对我不再需要的对象的引用。解决方案是将实体的集合类型更改为List而不是ListCollection。解决了内存泄漏问题。
但是,现在我注意到列表比ListCollection慢得多。如果检查对象是否已经在列表中,则Code流利每次向列表中添加一个对象。这将触发对象中的BaseContains方法。91%的CPU花在这里(使用蚂蚁进行分析)。我用CPU百分比标记了热门路径。
函数LoadByMainCwEntity包含以下代码块:
for (readerRead = reader.Read(); ((readerRead == true)
&& ((count < this.MaxCount)
&& (count < pageSize))); readerRead = reader.Read())
{
readCount = (readCount + 1);
if ((CodeFluent.Runtime.CodeFluentPersistence.CanAddEntity(pageIndex, pageSize, pageOptions, readCount) == true))
{
Runtime.CwObject cwObject = new Runtime.CwObject();
((CodeFluent.Runtime.ICodeFluentEntity)(cwObject)).ReadRecord(reader);
91% CPU >> if ((this.BaseContains(cwObject) == false))
{
this.BaseAdd(cwObject);
count = (count + 1);
}
cwObject.EntityState = CodeFluent.Runtime.CodeFluentEntityState.Unchanged;
}
}这就叫做:
protected virtual bool BaseContains(Runtime.CwObject cwObject)
{
if ((cwObject == null))
{
return false;
}
91% CPU >> bool localContains = this.BaseList.Contains(cwObject);
return localContains;
}这就叫做:
public virtual bool Equals(Runtime.CwObject cwObject)
{
if ((cwObject == null))
{
return false;
}
29% CPU >> if ((this.Guid.Equals(CodeFluentPersistence.DefaultGuidValue) == true))
{
return base.Equals(cwObject);
}
45% CPU >> return (this.Guid.Equals(cwObject.Guid) == true);
}所有的方法似乎都很轻。我想问题就在希特勒的身上。如果我有一个包含100.000个对象的列表,并且Code流利添加了编号100.001,它将检查所有100.000其他对象以找到匹配的对象。一个不断增长的集合将以指数级的速度减缓.Add方法。
检查对象是否已经在Code流利的正常“load”操作中位于集合中似乎有点奇怪。有什么解决办法吗?或者我应该接受这样一个事实:在Code流利中,大型列表的速度确实很慢?
发布于 2017-01-28 11:03:50
SoftFluent创建了一个方面,通过删除一些检查和通用性来提高生成代码的性能:博客帖子,GitHub上的代码。在Frans提供的基准测试中,使用这个方面,CodeFluent实体在手工编码查询之后排在第二位。
如果仅在应用程序上下文中识别了少量加载方法,则可以创建使用生成的代码返回自定义集合的自定义C#方法。例如,您可以创建一个返回IEnumerable<T>而不是生成的集合的方法:
static IEnumerable<Order> LoadOrders()
{
using (IDataReader reader = OrderCollection.PageDataLoadAll(null))
{
while (reader.Read())
{
Order o = new Order();
o.RaisePropertyChangedEvents = false;
((ICodeFluentEntity)o).ReadRecord(reader);
yield return o;
}
CodeFluentPersistence.CompleteCommand(Constants.NorthwindStoreName);
}
}更新
当您在表面上选择一个属性时,fastReader属性应该在属性网格中可见。您必须选择“方面和生产者属性”选项卡:

属性由相貌添加
<cf:descriptor name="fastReader" targets="Property" defaultValue="false" displayName="Enable Fast Reader" typeName="boolean" description="Determines if the fast reder is enabled for collection loading." category="Faster Reader Aspect" />方面移除自动转换(CodeFluentPersistence.GetReaderValue),并期望存储过程返回所有列。在某些情况下,它可能不起作用。
https://stackoverflow.com/questions/41908319
复制相似问题