5

我最近一直在运行一些基准测试,试图为 C++ 和 Java 找到“最好的”序列化框架。对我来说构成“最佳”的因素是反序列化/序列化的速度以及序列化对象的最终大小。

如果我查看 Java 中各种框架的结果,我发现生成的 byte[] 通常小于内存中的对象大小。甚至内置 Java 序列化也是如此。然后,如果您查看其他一些产品(protobuf 等),则大小会减少得更多。

当我查看有关 C++ 大小(boost、protobuf)的东西时,我感到非常惊讶,结果对象通常不小于(在某些情况下大于)原始对象。

我在这里错过了什么吗?为什么我在 Java 中免费获得大量“压缩”,而在 C++ 中却没有?

nb 用于测量 Java 中对象的大小,我正在使用 Instrumentation http://docs.oracle.com/javase/6/docs/api/java/lang/instrument/Instrumentation.html

4

2 回答 2

3

您是否比较了数据的绝对大小?我会说Java有更多的开销,所以如果你将数据“压缩”到一个序列化的缓冲区中,开销就会减少很多。在 C/C++ 中,您几乎只有物理数据大小所需的最低限度,因此没有太多压缩空间。事实上,你必须添加额外的信息来反序列化它,这甚至可能导致增长。

于 2013-05-24T06:49:51.003 回答
1

由于数据成员之间的偏移位,可以观察到对象大小大于实际数据大小。

当一个对象被序列化时,这些偏移位被丢弃,因此,序列化的对象内存更小。

因为java是一个托管环境,它需要更多这样的偏移数据来控制内存和所有权,因此它们的压缩率更大。

于 2013-05-24T07:12:00.343 回答