gpt4 book ai didi

java - ByteBuffer/IntBuffer/ShortBuffer Java 类速度快吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:49:57 25 4
gpt4 key购买 nike

我正在开发一个 Android 应用程序(显然是用 Java 编写的)并且我最近更新了我的 UDP 阅读器代码。在这两个版本中,我都设置了一些缓冲区并接收了一个 UDP 数据包:

byte[] buf = new byte[10000];
short[] soundData = new short[1000];
DatagramPacket packet = new DatagramPacket (buf, buf.length);
socket.receive (packet);

在初始版本中,我一次一个字节地将数据放回一起(实际上是 16 个 PCM 音频数据):

for (int i = 0; i < count; i++)
soundData[i] = (short) (((buf[k++]&0xff) << 8) + (buf[k++]&0xff));

在更新的版本中,我使用了一些我开始时不知道的很酷的 Java 工具:

bBuffer  = ByteBuffer.wrap (buf);
sBuffer = bBuffer.asShortBuffer();
sBuffer.get (soundData, 0, count);

在这两种情况下,“计数”都被正确填充(我检查过)。但是,我的流式音频似乎出现了新问题——也许它的处理速度不够快——这对我来说没有任何意义。显然,缓冲区代码被编译成远远超过三个 JVM 代码语句,但当我开始这个时,第二个版本比第一个版本更快似乎是一个合理的假设。

表面上,我并不是坚持我的代码必须使用 Java NIO 缓冲区,但至少乍一看,这样做确实像是一个 mo'betta'。

有人对快速、简单的 Java UDP 阅读器有任何建议吗?是否有普遍接受的“最佳方法”?

谢谢,

最佳答案

如果不是将数据包读入字节数组(将数据从 native 缓冲区复制到数组中)然后将其包装在新的 ByteBuffer 中(创建新对象)并转换为 ShortBuffer,您的代码会更高效(创建一个新对象)您只设置了一次对象并避免了复制。

您可以通过使用 DatagramChannel.socket() 创建套接字,然后像往常一样连接它并使用 socket.getChannel() 获取 DatagramChannel 对象来完成此操作。该对象将允许您将数据包直接读入现有的 ByteBuffer(您应该使用 ByteBuffer.allocateDirect 创建以获得最大效率)。然后,您只需使用一次 asShortBuffer() 即可将您的数据创建为短裤,并在每次重新填充 ByteBuffer 后从该 ShortBuffer 中读取。

因此代码如下所示:

 DatagramSocket socket = DatagramChannel.socket();
// code to connect socket
DatagramChannel channel = socket.getChannel();
ByteBuffer buffer = ByteBuffer.allocateDirect (10000);
// you may want to invoke buffer.order(...) here to tell it what byte order to use
ShortBuffer shortBuf = buffer.asShortBuffer();

// in your receive loop:
buffer.clear();
channel.receive(buffer);
shortBuf.position(0).limit(buffer.position()/2); // may ignore a byte if odd number received
shortBuf.get(soundBuf,0,shortBuf.limit());

您应该会发现这比您以前的代码更有效,因为它避免了数据的完整副本,并且格式转换由手动优化的代码处理,而不是由编译器生成的字节操作处理,后者可能不是最优的。如果您使用平台本地字节顺序,它会更有效率(我相信 Android 在所有可用的平台上使用小端字节顺序,并且您上面的代码似乎是大端字节序,所以这可能是不可能的对你来说),在这种情况下 shortBuf.get() 变成直接内存拷贝。

关于java - ByteBuffer/IntBuffer/ShortBuffer Java 类速度快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4037851/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com