假设我们有共同的Serial,我们正在监听传入的字节。假设写入速度不仅仅是读取,为了不从Serial中松开字节,我们引入缓冲区并执行下一步。串行侦听器只是将字节放入缓冲区(缓冲区写入程序线程)和缓冲区读取器中以从缓冲区(缓冲区读取线程)中提取字节并分析数据。
在串行和ConcurrentLinkedQueue<Integer>
之间切换原始int incomingByte
时使用java 1.5 Queue<Integer>
考虑装箱和拆箱效率有多高效?
限制:
我知道经常使用固定大小的缓冲区,如int[] buffer[BUFFER_SIZE]
,但我不希望有缓冲区限制。
最好让线程安全开箱即用,不要使用阻塞缓冲区或smth手动同步线程。
答案 0 :(得分:1)
设备的传输速度(字节/秒)是多少?如果每秒小于1 MB,那么采用哪种方法可能无关紧要。
如果您正在编写字节,为什么不使用ConcurrentLinkedQueue<Byte>
每个可能的字节值都被缓存,因此自动装箱和拆箱只有一个名义上的成本。
主要的表现瓶颈是队列中的链接条目。每个字节仍然创建一个对象(列表中的节点),每个对象使用大约16个字节。换句话说,你可以使byte[]
16x更大,它将使用相同数量的内存并减少垃圾。
为了满足您的要求,您可以使用ConcurrentLinkedQueue<Byte>
,但为byte[]
创建环形缓冲区会更快(并且很容易重新调整大小)
如果您发送的速度超过10 MB / s,我建议编写ByteBuffer并与另一个线程交换(即一次性传输大块)