|
|
1
2
我对原始的基于while的代码片段的第一个关注点是字节缓冲区的恒定内存分配。在这里放置一个“new”语句,专门用于.NET内存管理器,为缓冲区分配内存,同时获取在上一次迭代中分配的内存,并将其发送回未使用的池,以便最终进行垃圾收集。在一个相对紧密的循环中,这似乎需要做很多工作。 我很好奇,如果在设计时以合理的大小(比如8K)创建此缓冲区,您将获得性能改进,这样您就不会有所有这些内存分配、释放和碎片。那会有帮助吗?
在这种情况下,您实际上不需要重新分配缓冲区,因为在循环迭代1中分配的100字节缓冲区足以处理在循环迭代2中接收的75字节。无需销毁100字节的缓冲区并创建75字节的缓冲区。(当然,如果您只是静态地创建缓冲区并将其移出循环,这是没有意义的。)
|
|
2
1
它可以是如此简单。。。 要么使用DataReceived处理程序,但没有循环,当然也没有Sleep(),读取准备好的数据并将其推送到某个地方(队列或内存流), 或 启动一个线程(BgWorker)并执行(阻塞)serialPort1.Read(…),然后再次推送或组装您获得的数据。 编辑:
Edit2,关于更新2:
现在,可能您的记录大小可变,您不想等待接下来的126个字节来完成一个。您可以通过减小缓冲区大小或设置读取超时来对此进行调整。要获得非常精细的粒度,可以使用port.ReadByte()。因为它是从ReadBuffer读取的,所以实际上并不慢。 |
|
|
3
0
|