在CodeFluent中使用列表时收集速度慢

彼得·德·布赖恩(Peter de Bruijn)

我在CodeFluent中遇到了内存泄漏问题,因为对象的ListCollections的事件处理程序维护了对我不再需要的对象的引用。解决方案是将实体的收集类型更改为List而不是ListCollection。这就解决了内存泄漏的问题。

但是,现在我注意到List比ListCollection慢得多。每次Codefluent检查对象是否已在列表中时,都将其添加到列表中。这将在对象中触发BaseContains方法。91%的CPU花费在这里(使用ANTS进行性能分析)。我已经用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个对象的列表,并且Codefluent添加了100.001的数字,它将检查所有其他100.000个对象以找到匹配项。不断增长的集合将成倍地减慢.Add方法的速度。

在Codefluent的正常“加载”操作中检查对象是否已在集合中似乎有些奇怪。有什么解决方法,还是我应该只接受Codefluent中的大型列表速度真的很慢的事实?

梅赞头

SoftFluent通过消除一些检查和通用性,创建了一个可以提高所生成代码性能的方面博客文章GitHub上的代码在Frans Bouma提供的基准测试中,使用此方面,在手动编码查询之后,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),并期望存储过程返回所有列。在某些情况下,它可能不起作用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在 Oracle 中使用 datediff 函数时查询速度慢

来自分类Dev

网络速度慢

来自分类Dev

Firefox速度慢

来自分类Dev

为什么使用UItouch绘制PNG图像时响应速度慢?

来自分类Dev

Python列表追加和扩展-速度慢

来自分类Dev

LINQ to Entities Any()和Contains()速度慢,列表小

来自分类Dev

Python列表追加速度慢?

来自分类Dev

在13.04中关机速度慢,在关闭进程时挂起

来自分类Dev

整理大型空内容文件时,处理速度慢

来自分类Dev

与实例化视图连接时查询速度慢

来自分类Dev

在13.04中关机速度慢,在关闭进程时挂起

来自分类Dev

互联网速度慢时的下载问题

来自分类Dev

FIND_IN_SET速度慢,无法使用IN()

来自分类Dev

使用ftpes SOC到PC的传输速度慢

来自分类Dev

对象检测速度慢且不使用 GPU

来自分类Dev

SQL加载速度慢

来自分类Dev

Django速度慢的原因

来自分类Dev

图像检索速度慢

来自分类Dev

速度慢,但程序不慢

来自分类Dev

图像检索速度慢

来自分类Dev

DNS解析速度慢

来自分类Dev

磁盘写入速度慢

来自分类Dev

Tesseract:仅当并行运行多个进程时,CPU使用率高且速度慢

来自分类Dev

Node.js GPU.js使用GPU的速度比使用CPU的速度慢

来自分类Dev

通过Apache下载的速度比使用PHP readfile的下载速度慢

来自分类Dev

为什么对列表进行硬编码比计算速度慢?

来自分类Dev

timedelta方法的执行速度慢

来自分类Dev

Java速度慢且堆大

来自分类Dev

为什么istream / ostream速度慢