9

如果性能是一个问题,我应该更喜欢二进制序列化而不是 ascii / 文本序列化吗?

有人用大量数据测试过吗?

4

3 回答 3

13

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

于 2009-06-29T13:36:52.407 回答
4

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

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

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 构建的文件和 walltime 是:

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

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

因此,速度上的增益比文件大小建议的要大,并且使用二进制可以获得额外的好处。

于 2014-04-11T16:39:59.213 回答
1

如果性能是一个问题,我建议您查看protobuf - 协议缓冲区

来自 .Net 的“协议缓冲区”

于 2009-06-29T12:38:30.823 回答