1

假设我们有共同的 Serial 并且我们正在监听传入的字节。假设写入速度超过读取速度,为了不从串行中丢失字节,我们引入缓冲区并执行下一步。串行侦听器只是将字节放入缓冲区(缓冲区写入线程)和缓冲区读取器以从缓冲区(缓冲区读取线程)中提取字节并分析数据。

在从串行和ConcurrentLinkedQueue<Integer>原始之间切换时,考虑到装箱和拆箱,使用 java 1.5 的效率如何?int incomingByteQueue<Integer>

限制:

  1. 没有缓冲区大小限制

我知道经常int[] buffer[BUFFER_SIZE]使用固定大小的缓冲区,但我不想有缓冲区限制限制。

  1. 线程安全

最好有开箱即用的线程安全,并且不要使用阻塞缓冲区或 smth 手动同步线程。

4

1 回答 1

1

您设备的传输速度(以字节/秒为单位)是多少?如果它小于每秒 1 MB,那么您采用哪种方法可能并不重要。


如果您正在写入字节,为什么不使用ConcurrentLinkedQueue<Byte> 缓存每个可能的字节值,这样自动装箱和拆箱只有一个名义成本。

主要的性能瓶颈是队列中的链接条目。每个字节仍然创建一个对象(即列表中的节点),每个对象使用大约 16 个字节。换句话说,您可以使您的byte[]16 倍更大,它将使用相同数量的内存并产生更少的垃圾。

为了满足您的要求,您可以使用ConcurrentLinkedQueue<Byte>,但是为 a 创建一个环形缓冲区byte[]会更快(并且易于调整大小)

如果您发送的速度超过 10 MB/s,我建议您编写 ByteBuffer 并与另一个线程交换(即,您一次传输大块)

于 2011-12-13T13:59:20.617 回答