当'ProtoMember'被修改时,使用protobuf-net快速降低速度

时间:2014-10-26 20:33:37

标签: c# serialization protobuf-net b-plus-tree

我使用两个很棒的库BPlusTreeProtobuf-net来存储/检索磁盘上的大量项目。我允许修改任何序列化的项目......到目前为止,一切都很完美。在第一次修改时,速度下降到1/3,在第二次修改时下降到1/4,依此类推,如下图所示:

items insertion to B+Tree speed 每一行代表相同数据的不同运行;重要的是,在所有测试中,当修改集合中的项目时,速度会降低。修改后的项目是一个类的列表;直到第一次降级(即第22组 - 大约22 * 200,000项)此列表仅包含一个实例。之后,逐项更新项目以获得更多两个类对象,直到第42组(大约42 * 200,000项),当项目开始每个有3个实例时,依此类推。

我的项目来自班级' B'它的实现方式如下:

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

我将我的(de)序列化程序定义如下:

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

如何说_lambda<...>尺寸是导致速度下降的原因?请查看以下图表以获取说明。正如您所注意到的那样,当_lambda<...>尺寸发生变化时,我开始受到速度惩罚。

enter image description here

有什么建议会出错吗?

PS:有数千条线路在做这项工作,但缩小代码似乎问题是由#Readfrom&#39;和&#39; WriteTo&#39;功能。因此,我只在这里放置这些线。

0 个答案:

没有答案