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

wip*_*wip 7 c++ performance serialization boost

我使用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
};
Run Code Online (Sandbox Code Playgroud)

序列化代码看起来像这样(在侵入版本中,为了便于阅读,我没有编写上面的函数声明):

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;
}
Run Code Online (Sandbox Code Playgroud)

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

ild*_*arn 3

如果我必须选择 Boost.Serialization 的最大缺点,那就是性能不佳。如果 400 毫秒确实太慢,那么要么使用更快的硬件,要么切换到不同的序列化库。

也就是说,以防万一您做的事情明显“错误”,您应该发布 、 和 的序列ContainerContainer::SmallObject代码Container::SmallObject::CustomData。您还应该确保实际上是反序列化花费了 400 毫秒,而不是反序列化 + 从磁盘读取数据的组合;即,将数据加载到某种内存流中并从中反序列化,而不是从std::fstream.


编辑(回应评论):

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

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();
}
Run Code Online (Sandbox Code Playgroud)

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

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