序列化——c++和Java之间的区别
Serialization - differences between C++ and Java
我最近一直在运行一些基准测试,试图找到c++和Java的"最佳"序列化框架。对我来说,构成"最好"的因素是反/序列化的速度以及序列化对象的最终大小。
如果我看一下Java中各种框架的结果,我发现生成的byte[]通常小于内存中的对象大小。甚至内置的Java序列化也是如此。如果你再看看其他的一些产品(protobuf等),大小就更小了。
当我查看c++大小(boost, protobuf)时,我感到非常惊讶,结果对象通常不会比原始对象小(在某些情况下更大)。
我错过了什么吗?为什么我可以在Java中免费获得大量的"压缩",而在c++中却没有?
n。b用于测量Java中对象的大小,我使用Instrumentation http://docs.oracle.com/javase/6/docs/api/java/lang/instrument/Instrumentation.html
您是否比较了数据的绝对大小?我会说Java有更多的开销,所以如果您将数据"压缩"到序列化缓冲区中,那么开销会减少得更多。在C/c++中,您几乎拥有物理数据大小所需的最小值,因此没有太多的压缩空间。事实上,您必须添加额外的信息来反序列化它,这甚至可能导致增长。
由于数据成员之间的偏移位,可以观察到对象大小大于实际数据大小。
当一个对象被序列化时,这些偏移位被丢弃,因此,序列化的对象内存更小。
因为java是一个托管环境,它将需要更多这样的偏移数据来控制内存和所有权,因此,它们的压缩率更大。
相关文章:
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在 const 函数中通过引用和指针返回之间的区别
- 我想知道长双倍和双倍之间的区别
- 这 4 个 lambda 表达式之间有什么区别?
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- (double) 和 double() 之间的区别
- & 和 * 之间的区别
- std::is_convertible 和 std::convertible_to 之间的区别(在实践中)?
- 析构函数和'delete'之间的区别
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- 从预序遍历构造 bst 的 c++ 和 python 解决方案之间的区别
- vector.back() 和 vector[vector.size() - 1] 之间的区别?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 函数签名与调用的函数不匹配,常量字符[]和字符*之间的区别?
- OpenMP #pragma omp for v/s #pragma omp parallel for 之间的区别?
- S() 与 S{} 之间的区别?