Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在CodeFluent中使用列表时,收集速度较慢_C#_List_Codefluent - Fatal编程技术网

C# 在CodeFluent中使用列表时,收集速度较慢

C# 在CodeFluent中使用列表时,收集速度较慢,c#,list,codefluent,C#,List,Codefluent,我在CodeFluent中遇到了memoryleak问题,因为ListCollections对象的EventHandler维护了对我不再需要的对象的引用。解决方案是将实体的集合类型更改为List而不是ListCollection。这解决了内存泄漏问题 但是,现在我注意到列表比ListCollection慢得多。每次Codefluent向列表中添加对象时,如果检查对象是否已在列表中。这将在对象中激发BaseContains方法。91%的CPU在这里使用(使用ANTS分析)。我已经用CPU百分比标记

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

但是,现在我注意到列表比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;
    }
}
这就叫:

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创建了一个方面,通过删除一些检查和泛型来提高生成代码的性能:。在Frans Bouma提供的基准测试中,使用这一方面,CodeFluent实体排在手动编码查询之后的第二位

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

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);
    }
}

特性删除自动转换(
CodeFluentPersistence.GetReaderValue
),并期望存储过程返回所有列。在某些情况下,它可能不起作用。

除了我不会在.NET中操纵100000多个对象的集合/列表/其他任何东西(见鬼,这就是关系数据库的强项,操纵一组对象),您可以编写一个方面来删除BaseContains调用,正如您所指出的,这确实是瓶颈,如果您确定不需要(CodeFluent无法确定)嗨,Meziantou,我已经尝试了您的建议,事实上,应用程序的某些部分现在快了约450倍。哇!我必须将方面更改为工作状态,因为我不知道如何在实体上设置“fastReader”属性值。我本以为de属性编辑器中会显示一个新属性,但我没有看到它。我还有两个问题:1)如何/在何处设置属性值“fastReader”?2) 你能想出一个不在每个实体上设置属性的原因吗?顺便说一句,在'Resolve'方法的aspect中有一个未处理的exeption。如果变量“Property”为null,则项目将不会生成,因为以下行为Console.WriteLine(“Property:+Property.Name+”null:+Property.IsNullable+“mn:+Property.isModelEnable);如果您将其更改为If(Property==null){Console.WriteLine(“Property为null”);}或者{Console.WriteLine(“prop:+Property.Name+“nullable:”+Property.IsNullable+“mn:”+Property.IsModelNullable);}它可以工作。我现在看到了该属性,但我很困惑,为什么方面设置在属性上,而不是实体本身?事实上,如果我在属性上设置aspect,什么都不会发生。如果我剪切了一段代码,并将其粘贴到cfp中的实体中,它将按预期工作。调试aspect时,我还看到它查看实体的aspect值,而不是属性。对于启用fastread的实体,一切似乎都正常,只有_rowversion不工作。这个.uRowVersion=reader.GetByte(索引[37]);在编译时引发以下错误:无法将“byte”隐式转换为“byte[]”;请随意编辑方面的代码以满足您的需要。
GetXXX
方法名称是在计算的,不处理数组类型。您可以添加一个条件,如
typeof(byte[])。IsAssignableFrom(prop.ClrType)
=>
GetBytes
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);
    }
}
<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" />