首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在CodeFluent中使用List时慢集合

在CodeFluent中使用List时慢集合
EN

Stack Overflow用户
提问于 2017-01-28 09:40:20
回答 1查看 124关注 0票数 1

我在CodeFluent中出现了内存泄漏问题,因为对象的ListCollections均衡器维护了对我不再需要的对象的引用。解决方案是将实体的集合类型更改为List而不是ListCollection。解决了内存泄漏问题。

但是,现在我注意到列表比ListCollection慢得多。如果检查对象是否已经在列表中,则Code流利每次向列表中添加一个对象。这将触发对象中的BaseContains方法。91%的CPU花在这里(使用蚂蚁进行分析)。我用CPU百分比标记了热门路径。

函数LoadByMainCwEntity包含以下代码块:

代码语言:javascript
复制
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;
    }
}

这就叫做:

代码语言:javascript
复制
protected virtual bool BaseContains(Runtime.CwObject cwObject)
        {
            if ((cwObject == null))
            {
                return false;
            }
            91% CPU >> bool localContains = this.BaseList.Contains(cwObject);
            return localContains;
        }

这就叫做:

代码语言:javascript
复制
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流利中,大型列表的速度确实很慢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-28 11:03:50

SoftFluent创建了一个方面,通过删除一些检查和通用性来提高生成代码的性能:博客帖子GitHub上的代码。在Frans提供的基准测试中,使用这个方面,CodeFluent实体在手工编码查询之后排在第二位。

如果仅在应用程序上下文中识别了少量加载方法,则可以创建使用生成的代码返回自定义集合的自定义C#方法。例如,您可以创建一个返回IEnumerable<T>而不是生成的集合的方法:

代码语言:javascript
复制
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属性应该在属性网格中可见。您必须选择“方面和生产者属性”选项卡:

属性由相貌添加

代码语言:javascript
复制
<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),并期望存储过程返回所有列。在某些情况下,它可能不起作用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41908319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档