bio是流式的,看源码你会发现,最终都调用read()方法,也就是一个字节一个字节地读;
nio是块式的,一块一块地读写。
操作系统的文件系统是块式的,所以一般来说,nio更快。

解决方案 »


  1. 没区别。io/nio的主要区别在异步和同步的调用,性能差异主要在多连接的处理上。
      


  2. 没区别。io/nio的主要区别在异步和同步的调用,性能差异主要在多连接的处理上。没区别的判定太武断了。从理论上来说,传统的io用的是设备中断方式,读写数据是以「字」为单位的(注意是字,不是字节),一般来说64位系统,中断一次也就能读1个字;如果使用nio方式,Java会尽量使用贴近操作系统的,更优化的方式,比如DMA方式,或者通道方式,去读写数据,这样的话,处理至少是以块为单位的,并且CPU基本上处于放权的状态,直到数据全部加载进内存,CPU才会去要回控制权。所以在现代操作系统中,一般NIO都会比IO快。
      


  3. 没区别。io/nio的主要区别在异步和同步的调用,性能差异主要在多连接的处理上。没区别的判定太武断了。从理论上来说,传统的io用的是设备中断方式,读写数据是以「字」为单位的(注意是字,不是字节),一般来说64位系统,中断一次也就能读1个字;如果使用nio方式,Java会尽量使用贴近操作系统的,更优化的方式,比如DMA方式,或者通道方式,去读写数据,这样的话,处理至少是以块为单位的,并且CPU基本上处于放权的状态,直到数据全部加载进内存,CPU才会去要回控制权。所以在现代操作系统中,一般NIO都会比IO快。
    个人认为,你写的这段还需要再回炉重新学习一下相关的理论知识,尤其是你说的那个一般来说那一句话。实际上来说,程序的效率更多取决于程序员的水平和实际的业务场景。具体用不用nio,看是不是有这个必要。
      


  4. 没区别。io/nio的主要区别在异步和同步的调用,性能差异主要在多连接的处理上。没区别的判定太武断了。从理论上来说,传统的io用的是设备中断方式,读写数据是以「字」为单位的(注意是字,不是字节),一般来说64位系统,中断一次也就能读1个字;如果使用nio方式,Java会尽量使用贴近操作系统的,更优化的方式,比如DMA方式,或者通道方式,去读写数据,这样的话,处理至少是以块为单位的,并且CPU基本上处于放权的状态,直到数据全部加载进内存,CPU才会去要回控制权。所以在现代操作系统中,一般NIO都会比IO快。
    个人认为,你写的这段还需要再回炉重新学习一下相关的理论知识,尤其是你说的那个一般来说那一句话。实际上来说,程序的效率更多取决于程序员的水平和实际的业务场景。具体用不用nio,看是不是有这个必要。「一般来说」的说法,是因为现代操作系统大多都提供DMA和通道方式去读写块式设备,但是不排除某些操作系统不支持,或者硬件不支持。而且Java也只是说尽可能贴近操作系统的实现去做NIO,它也不保证。所以我使用了「一般来说」这个用词。还有,不要动不动就让人「回炉学习」,你至少得贴一个说得过去的理由吧。实际上这部分,你在转移话题。就题主给的问题来说,NIO确实比IO有优势,尤其是处理大块数据的时候。
      


  5. 抱歉,确实错了。一次中断,确实不是一个字,但是CPU读取一次数据是一个字。
    一次中断,一般是一个磁盘缓冲区塞满。
    但CPU读磁盘缓冲区中的数据是一个字一个字读的,而DMA传输数据一次就是一个磁盘缓冲区。
    还是NIO快。
      


  6. 抱歉,确实错了。一次中断,确实不是一个字,但是CPU读取一次数据是一个字。
    一次中断,一般是一个磁盘缓冲区塞满。
    但CPU读磁盘缓冲区中的数据是一个字一个字读的,而DMA传输数据一次就是一个磁盘缓冲区。
    还是NIO快。
    其实,我想告诉你的事情是,nio相对于io来说,得到最关键的提升还是异步IO在网络处理性能上的。而中断和CPU读数据,是两件事。
      

  7. 看具体的应用场景吧。主要是区别是一个是异步IO(NIO),一个是同步IO(传统IO)。
    至于是流方式比较快还是块方式比较快,这个没有测试过,普遍的理论都认为是块方式比较快。
    在读取文件方面,小文件用传统IO,大文件用NIO。在处理网络连接方面,优先选择NIO。
      


  8. 对性能有点要求的服务器侧的网络,必须用NIO。对网络连接数量上没有要求的客户端程序,建议还是IO,开发调试起来比较快一点。
      

类似问题 »