性能:ConcurrentLinkedQueue <integer>作为串行传入缓冲区</integer>

时间:2011-12-13 12:20:27

标签: java concurrency buffer serial-communication

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

在串行和ConcurrentLinkedQueue<Integer>之间切换原始int incomingByte时使用java 1.5 Queue<Integer>考虑装箱和拆箱效率有多高效?

限制:

  1. 没有缓冲区大小限制
  2. 我知道经常使用固定大小的缓冲区,如int[] buffer[BUFFER_SIZE],但我不希望有缓冲区限制。

    1. 线程安全
    2. 最好让线程安全开箱即用,不要使用阻塞缓冲区或smth手动同步线程。

1 个答案:

答案 0 :(得分:1)

设备的传输速度(字节/秒)是多少?如果每秒小于1 MB,那么采用哪种方法可能无关紧要。


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

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

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

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