0

如果我使用二进制传输(例如AMF 协议)将具有 100 个元素(例如)的数据类型 double 的数组从应用程序服务器的(Linux CentOS)Java(1.6)方法传递给客户端,则传输了多少字节?

例如,如果它是一个双浮点数数组,每个数字占用 8 个字节。那么,如果数组有 100 个元素长,并且每个元素都为空,是否会传输 800 字节的数组大小?也就是说,如果为null,每个元素是否仍然占用8个字节?

更新:

最终,我对上述问题的理解是,我在服务器上有一个 (x,y) 数据集,它代表一个情节。y 数据是唯一的,但 x 数据是等距的。因此,我可以避免将 x 数据从服务器传输到客户端(而是传输 x 间隔并让客户端重新创建可预测的 x 轴值)。但是,从服务器传递到客户端的数组显示为:

myArray[0].x = null
myArray[0].y = 1e-302
myArray[1].x = null
myArray[1].y = 1.42e-202
...
myArray[99].x = null
myArray[99].y = 2.3234e-3

我想知道这些null值是否每个都是 8 个字节长,或者我是否会节省一些内存,因为它们是null.

更新 2:

BlazeDS(例如 LCDS)文档的 PDF 第 82 页描述了从 Java 到 ActionScript AMF3(由 BlazeDS 和 LCDS 使用)的转换。在 PDF 第 83 页上的表格显示了 Java 类型null映射到 ActionScript AMF3 类型null

4

2 回答 2

3

在 AMF0 中,根据您链接到的 Wikipedia 文章,“数字”(AMF0 唯一的数字类型,但它对应于 Java 的double)将是九个字节(0x00表示它是一个数字,加上数字的双精度浮点数的八个字节-点表示),而 anull只是一个字节(0x05)。一个数组包含两个字节(初始0x08和最终0x09)加上它的内容,所以如果数组的长度为n,并且它的元素k是数字,那么它的总大小将是 2 + 9 × k + ( n - k ) = 2 + n + 8 × k。如你看到的,nulls 可能会显着减少传输负载。

AMF3 在细节上有所不同,但相似。

于 2012-09-12T02:35:34.983 回答
2

Java SE 中没有 DOUBLE 数据类型。既然它是可空的,那么我们谈论的是Double(而不是double)。包装类型 ( ) 的实例Double比原始类型 ( ) 的值使用更多的内存double

任何空引用所使用的内存都将少于类实例引用的内存消耗加上用于存储实例本身的内存。您可能天真地假设空引用使用 4 或 8 个字节(取决于您使用的是 32 位还是 64 位 JVM),但是JVM 可以使用一些花哨的优化优化潜在地减小对象的大小参考(更多关于这里这里)。

无论哪种方式,如果您非常关心内存使用情况,那么您为什么要使用Double,而不是double? 如果只是因为您需要“无价值”值,请使用Double.NaN.

于 2012-09-12T02:28:09.317 回答