我正在编写一个Android应用程序来同时升级四五个医疗设备的固件。我应该采用传统的阻塞I / O,采用每个连接线程或非阻塞NIO方法。
该程序已经可以正常处理一次设备。
这会有更大的开销? java NIO开销或上下文切换开销
非常感谢任何帮助。
答案 0 :(得分:2)
如果设备的数量是四个或五个,并且不会很快增长至少两个数量级,我建议你坚持使用阻塞I / O和每个连接模式的线程简单性以及在这种情况下您不太可能看到NIO的任何性能改进,并且性能下降实际上是非常可能的。即使对于比4或5更多的任务,线程切换也能很好地工作,并且编程模型非常简单。如果通信代码使用套接字,则使用NIO可能有一个优势,因为选择器允许您比IO Streams更好地检测某些类型的断开连接。但是,即使是这种情况,我也建议在每个客户端的线程模型中使用NIO,因为它可能会为您节省大量的代码工作。
答案 1 :(得分:1)
java NIO开销或上下文切换开销
这是错误的问题。 NIO没有太大的开销,但是你必须在你的应用程序中自己实现“上下文切换”,你不能只是假装它已经消失了NIO ......你的代码在通道之间调度可能不会与操作系统的线程调度程序一样高效。真正的问题是线程保存和更具体的线程堆栈是否与NIO代码的复杂性大大增加有关。除非您计划为数万个连接提供服务,否则它通常不会。
值得注意的是,使用选择器的NIO模型起源于线程之前,即当选择在更复杂的代码和更多进程之间时。这些天有一个重要的思想学派认为你应该在几乎所有情况下都使用阻塞I / O和线程。在某个地方有一项研究和一篇论文,我认为彼得·劳里,但我没有引用手。