如何使boost :: serialization反序列化更快?

我使用boost :: serialization来保存包含这些数据的对象:

struct Container
{
    struct SmallObject
    {
        struct CustomData
        {
            unsigned first;
            float second;
        };

        std::vector<CustomData> customData; // <- i can have 1 to 4 of these in the std::vector
        float data1[3];
        float data2[3];
        float data3[2];
        float data4[4];
    };

    std::vector<SmallObject> mySmallerObjects;  // <- i can have 8000 to 13000 of the std::vector
};

序列化代码看起来像这样(这在侵入式版本中,我没有为了可读性目的而编写函数声明):

template<class Archive> void Container::SmallObject::CustomData::serialize(Archive& ar, unsigned /*version*/)
{
    ar & first;
    ar & second;
}

template<class Archive> void Container::SmallObject::serialize(Archive& ar, unsigned /*version*/)
{
    ar & customData;
    ar & data1
    ar & data2;
    ar & data3;
    ar & data4;
}

template<class Archive> void Container::serialize(Archive& ar, unsigned /*version*/)
{
    ar & mySmallerObjects;
}

我使用binary_archives。 在发布模式下,加载我的容器(有12000个小对象)需要大约400毫秒。 我被告知这太长了。 是否有任何设置或不同的内存布局会加速加载过程? 我应该使用boost :: serialization放弃吗?


如果我不得不选择Boost.Serialization的最大缺点,那么性能会很差。 如果400ms真的太慢,要么得到更快的硬件,要么切换到不同的序列化库。

这就是说,为Container::SmallObject万一你做了一些明显的“错误”,你应该发布ContainerContainer::SmallObjectContainer::SmallObject::CustomData的序列化代码。 你还应该确保它实际上是需要400ms的反序列化,而不是反序列化+从磁盘读取数据的组合; 即将数据加载到某种类型的存储器流中并反序列化,而不是从std::fstream反序列化。


编辑 (回应评论):

此代码适用于我使用VC ++ 2010 SP1和Boost 1.47测试版:

double loadArchive(std::string const& archiveFileName, Container& data)
{
    std::ifstream fileStream(
        archiveFileName.c_str(),
        std::ios_base::binary | std::ios_base::in
    );
    std::stringstream buf(
        std::ios_base::binary | std::ios_base::in | std::ios_base::out
    );
    buf << fileStream.rdbuf();
    fileStream.close();

    StartCounter();
    boost::archive::binary_iarchive(buf) >> data;
    return GetCounter();
}

如果这不适用于您,它必须特定于您正在使用的编译器和/或Boost版本(这是什么?)。

在我的机器上,对于x86版本构建(启用链接时代码生成),从磁盘加载数据占反序列化1.28MB文件所花费总时间的约9%(1个包含13000个SmallObject实例的Container ,每个实例包含4个CustomData实例); 对于x64发行版,从磁盘加载数据占反序列化1.53MB文件所花费的总时间(相同对象数)的〜17%。


我建议写入序列化数据流的数量,然后使用std :: vector :: reserve分配所有你需要的内存。 这样,你将会做最少的分配数量。

链接地址: http://www.djcxy.com/p/7969.html

上一篇: How to make boost::serialization deserialization faster?

下一篇: REST vs JSON