【发布时间】:2011-09-21 16:40:04
【问题描述】:
我使用 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 吗?
【问题讨论】:
-
这 400 毫秒只是为了从磁盘读取对象吗?
-
@karlphillip 和 @ildjarn :我分别对从磁盘加载文件的部分(包括创建 boost 存档)和有效的反序列化部分(实际上只是语句“archive>>data;”进行了基准测试)。磁盘读取部分为几毫秒,有效反序列化为390毫秒。
-
我们说的是多少字节?
-
@karlphillip : 1.07 MB(磁盘上 1,130,496 字节)
-
@wil :作为健全性检查,在反序列化之前,您究竟是如何从磁盘完全加载文件的?
标签: c++ performance serialization boost