提升序列化性能:文本与二进制格式

时间:2009-06-29 12:34:40

标签: c++ boost-serialization

如果性能有问题,我是否应该优先选择ascii / text序列化的二进制序列化?

有人在大量数据上测试过吗?

3 个答案:

答案 0 :(得分:13)

我使用boost.serialization来存储表示查找表和表的矩阵和向量 一些元数据(字符串),内存大小约为200MByte。 IIRC用于装载 磁盘进入内存,文本存档需要3分钟,使用二进制存档需要4秒 在WinXP上。

答案 1 :(得分:3)

对于涉及加载包含大量(数千)嵌套归档类的大型类的问题进行基准测试。

要更改格式,请使用存档流

boost::archive::binary_oarchive
boost::archive::binary_iarchive

而不是

boost::archive::text_oarchive
boost::archive::text_iarchive

加载(二进制)存档的代码如下:

std::ifstream ifs("filename", std::ios::binary);
boost::archive::binary_iarchive input_archive(ifs);
Class* p_object;
input_archive >> p_object;

上述代码段的优化gcc版本的文件和挂号时间为:

  • ascii: 820MB (100%), 32.2 秒(100%)。
  • 二进制: 620MB (76%), 14.7 秒(46%)。

这是来自固态驱动器,没有任何流压缩。

因此,速度的增加大于文件大小的建议,并且您可以使用二进制文件获得额外的奖励。

答案 2 :(得分:1)

如果效果有问题,我建议您调查protobuf - Protocol Buffers

"Protocol Buffers" from .Net