Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为Java编写或使用span/slice结构有什么意义吗?_Java_Allocation - Fatal编程技术网

为Java编写或使用span/slice结构有什么意义吗?

为Java编写或使用span/slice结构有什么意义吗?,java,allocation,Java,Allocation,背景:我正在编写一些代码,通过网络对二进制协议进行序列化和反序列化,并编写C#、Swift和Java客户机代码 我们从网络上获取一个数据包(字节数组),将其反序列化为一个结构树,然后遍历该树查找内容 在C#中,我使用了,它提供了对现有内存缓冲区的“视图”。同样,在Swift中,我使用了同样可以充当“视图”的。 在C++中,我可能会使用一些类似的概念。 基本上类似于: 原始缓冲区:R\u T1aaa\u T2bbb\u T3ccc 解析为Root->[Tag1[aaa]、Tag2[bbb]、Tag

背景:我正在编写一些代码,通过网络对二进制协议进行序列化和反序列化,并编写C#、Swift和Java客户机代码

我们从网络上获取一个数据包(字节数组),将其反序列化为一个结构树,然后遍历该树查找内容

在C#中,我使用了,它提供了对现有内存缓冲区的“视图”。同样,在Swift中,我使用了同样可以充当“视图”的。 在C++中,我可能会使用一些类似的概念。 基本上类似于:

原始缓冲区:
R\u T1aaa\u T2bbb\u T3ccc

解析为
Root->[Tag1[aaa]、Tag2[bbb]、Tag3[ccc]

在上面的模型中,根、Tag1、Tag2、Tag3对象是在堆栈上分配的结构。标记内容(aaa、bbb、ccc)只是指向底层原始缓冲区的指针,我们根本没有为它们分配或复制任何堆内存

在Java中,我首先创建了这样一个类(@markrotterveel善意地指出,我可以使用ByteBuffer,而不是创建自己的包装器类):

class ByteArrayView{
@非空的最终字节[]所有者;//共享
最终整数偏移量;
最终整数长度;
}
我将继续使用与C#,Swift中使用的相同模式,但是我想到了这个想法-我使用数组视图来避免堆分配,但是Java中的一切都是堆分配。我没有在位置周围复制一些
byte[]
值,而是分配
ByteArrayView
对象,但这仍然是堆分配

我知道,如果我有大的“切片”,那么像我的
ByteArrayView
java.nio.ByteBuffer
之类的东西会减少程序分配的内存总量,但大多数情况下,我的标记都很小,例如4字节、12字节、32字节

如果小
byte[]
对象仍然在堆上,那么将它们交换为包装器对象是否有任何有意义的结果?它真的会让事情变得更糟吗?因为在我们得到我们想要读取的实际字节之前,还有一个额外的间接寻址?它值得额外的代码复杂性吗


有经验的Java开发人员会在这里做什么?

请原谅我的无知,但是什么是TearrayView的
?这是一节课吗?如果是,那么它是JDK的一部分吗?为什么不为此使用
ByteBuffer
(尽管我没有仔细检查它是否完全适合您的用例)?@Abra ByteArrayView是我刚刚编写的一个类。这就是全部,对吗there@MarkRotteveel谢谢我没有考虑过ByteBuffer——我只是一个java开发人员,可能有5%的时间是这样的,所以我对API的了解不是很深。它看起来基本上是完美的,我现在不需要写我自己的ByteArrayView。但我认为问题仍然存在——如果我有10个堆分配的ByteBuffers,这真的比10个小的堆分配字节[]s好吗?我想,将这些类型的视图用于相对较小的源字节数组将产生比直接分配具有必要数据的对象更大的开销。如果数组很大,并且每个切片都有几十个或更多字节,则情况可能会有所不同。您可能想看看有关对象大小的问题,例如