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

C++ 如何使boost::序列化反序列化更快?,c++,performance,serialization,boost,C++,Performance,Serialization,Boost,我使用boost::serialization保存包含以下数据的对象: struct Container { struct SmallObject { struct CustomData { unsigned first; float second; }; std::vector<CustomData> customData; // <- i can

我使用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
};
struct容器
{
结构小型对象
{
结构自定义数据
{
先不签字;
浮动秒;
};

std::vector customData;//我建议将项目数写入序列化流,然后使用std::vector::reserve分配您所需的所有内存。这样,您将进行最小数量的分配。

如果我必须选择Boost.serialization的一个最大缺点,那么性能将很差。如果400ms实在太慢了,要么使用更快的硬件,要么切换到不同的序列化库

也就是说,以防万一你做了一些明目张胆的“错事”,您应该发布
Container
Container::SmallObject
Container::SmallObject::CustomData
的序列化代码。您还应该确保实际反序列化需要400毫秒,而不是反序列化+从磁盘读取数据的组合;也就是说,将数据加载到内存中我是某种类型的,并从中反序列化,而不是从
std::fstream
反序列化


编辑(回应评论):

这段代码适用于我使用VC++2010 SP1和Boost 1.47测试版的情况:

double-loadArchive(std::string const和archiveFileName、容器和数据)
{
std::ifstream文件流(
archiveFileName.c_str(),
std::ios_base::binary | std::ios_base::in
);
std::stringstream buf(
std::ios|u base::二进制| std::ios|u base::in | std::ios|u base::out
);
buf>数据;
返回GetCounter();
}
如果这对您不起作用,那么它必须特定于您正在使用的编译器和/或Boost版本(哪些是什么?)


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

这400毫秒是否仅用于从磁盘读取对象?@karlphillip和@ildjarn:I分别对从磁盘加载文件的部分进行了基准测试(包括创建boost归档文件)有效的反序列化部分(实际上只是“archive>>data;”语句)。磁盘读取部分是几毫秒,有效的反序列化是390毫秒。我们说的是多少字节?@karlphillip:1.07 MB(磁盘上1130496字节)@wil:作为一个健全的检查,在反序列化之前,你是如何完全从磁盘加载文件的?除非他将每个
向量的内容序列化为C数组(指针),而不是直接序列化
向量
,Boost。序列化在内部已经完全按照您的建议进行了。您是对的,实际上400毫秒代表从磁盘读取数据的组合(使用std::ifstream)+反序列化。我在最初的问题中添加了序列化代码。@wil:那么接下来你需要做的是从内存而不是磁盘进行基准反序列化。如果速度足够快,那么磁盘访问就是你的瓶颈,你对此无能为力……不过,我可以毫无问题地编译和运行你的代码发生了一件奇怪的事情,使用此方法加载存档要慢得多(4500毫秒)@wil:如果你不发布完整的复制,我不知道该告诉你什么…我的示例文件的反序列化在我的机器上需要约140毫秒。你使用的是什么编译器和Boost版本,你100%肯定你正在对启用优化的构建进行基准测试吗?
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;
}