C# 当';原成员';修改
我正在使用两个很棒的库,并在磁盘上存储/检索大量项目。我可以修改任何序列化项。。。到目前为止,一切都很完美。第一次修改时,速度降至1/3,第二次修改时,速度降至1/4,依此类推,如下图所示: 每行代表相同数据上的不同运行;重要的一点是,在所有测试中,当集合中的项目被修改时,速度都会降低。修改的项是一个类的列表;直到第一次降级(即第22组-大约22*200000项),此列表仅包含一个实例。之后,一个接一个的项被更新,以拥有该类的两个以上的对象,直到第42组(大约42*200000个项),这时项开始每个都有3个实例,依此类推 我的项目来自类“B”,它实现如下功能:C# 当';原成员';修改,c#,serialization,protobuf-net,b-plus-tree,C#,Serialization,Protobuf Net,B Plus Tree,我正在使用两个很棒的库,并在磁盘上存储/检索大量项目。我可以修改任何序列化项。。。到目前为止,一切都很完美。第一次修改时,速度降至1/3,第二次修改时,速度降至1/4,依此类推,如下图所示: 每行代表相同数据上的不同运行;重要的一点是,在所有测试中,当集合中的项目被修改时,速度都会降低。修改的项是一个类的列表;直到第一次降级(即第22组-大约22*200000项),此列表仅包含一个实例。之后,一个接一个的项被更新,以拥有该类的两个以上的对象,直到第42组(大约42*200000个项),这时项开
public class B<C, M>
{
internal B(char tau, M metadata)
{
_lambda = new List<Lambda<C, M>>();
_lambda.Add(new Lambda<C, M>(tau: tau, atI: metadata));
}
[ProtoMember(1)]
internal int omega { private set; get; }
[ProtoMember(2)]
private List<Lambda<C, M>> _lambda { set; get; }
internal ReadOnlyCollection<Lambda<C, M>> lambda { get { return _lambda.AsReadOnly(); } }
internal B<C, M> Update(char tau, M metadata)
{
B<C, M> newB= new B<C, M>();
newB._lambda = new List<Lambda<C, M>>(this._lambda);
newB._lambda.Add(new Lambda<C, M>(tau: tau, atI: metadata));
return newB;
}
}
public class Lambda<C, M>
{
internal Lambda(char tau, M atI)
{
this.tau = tau;
this.atI = atI;
}
[ProtoMember(1)]
internal char tau { private set; get; }
[ProtoMember(2)]
internal M atI { private set; get; }
}
公共B类
{
内部B(字符头,M元数据)
{
_lambda=新列表();
_添加(新的lambda(tau:tau,atI:metadata));
}
[原成员(1)]
内部intω{私有集;get;}
[原成员(2)]
私有列表_lambda{set;get;}
内部只读集合lambda{get{return}u lambda.AsReadOnly();}
内部B更新(字符tau,M元数据)
{
B newB=新的B();
newB.\u lambda=新列表(此.\u lambda);
新增lambda.Add(新lambda(tau:tau,atI:metadata));
返回新兵;
}
}
公共级Lambda
{
内部Lambda(char tau,M atI)
{
this.tau=tau;
this.atI=atI;
}
[原成员(1)]
内部字符tau{private set;get;}
[原成员(2)]
内部M atI{private set;get;}
}
我将我的(反)序列化器定义如下:
public B<C, M> ReadFrom(System.IO.Stream stream)
{
return Serializer.DeserializeWithLengthPrefix<B<C, M>>(stream, PrefixStyle.Fixed32);
}
public void WriteTo(B<C, M> value, System.IO.Stream stream)
{
Serializer.SerializeWithLengthPrefix<B<C, M>>(stream, value, PrefixStyle.Fixed32);
}
public B ReadFrom(System.IO.Stream)
{
返回Serializer.DeserializeWithLengthPrefix(stream,PrefixStyle.Fixed32);
}
public void WriteTo(B值,System.IO.Stream)
{
Serializer.SerializeWithLengthPrefix(流、值、PrefixStyle.Fixed32);
}
我怎样才能说\u lambda
尺寸是导致速度下降的原因?请查看下面的图表以获得澄清。正如您所注意到的,当lambda大小改变时,我开始受到速度惩罚
有什么问题吗
PS:有数千行代码在做这项工作,但缩小代码范围似乎是由“ReadFrom”和“WriteTo”函数引起的。因此,我在这里只放了这几行 y轴上显示的数字是否为根对象的数量?还是物体的总数?例如,列表中有1项的根可能是2个可序列化的对象;一个根目录中有3个项目的丢失是4。也不清楚兰姆达在这里做什么。没有它,它的行为还是一样吗?@MarcGravel,不幸的是,我不清楚你所说的根对象是什么意思。。。请你澄清一下好吗?@MarcGravell
\u lambda
是所有这些麻烦的原因!当Update
向\u lambda
添加一个项目时,我开始受到速度惩罚。@Hamad好的,忽略我刚才所说的关于lambda的内容-在第二次(etc)阅读时会更有意义。我所说的根对象的意思是:您是否正在测量反序列化*的调用?或者对象的总数,包括B
和Lambda
实例?再说一遍:一个根目录和三个列表项的对象数量是一个根目录和一个列表项的两倍…@Hamad也许我真正的意思是:我能做些什么来重现你所看到的?