java IO、NIO

wyc_ 2015-03-11 04:21:29
java IO采用数组的方式读写与java nio采用缓冲区的方式读写哪个效率更高呢?
...全文
262 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
skgary 2015-03-13
  • 打赏
  • 举报
回复
引用 10 楼 gaofuqi 的回复:
看具体的应用场景吧。主要是区别是一个是异步IO(NIO),一个是同步IO(传统IO)。 至于是流方式比较快还是块方式比较快,这个没有测试过,普遍的理论都认为是块方式比较快。 在读取文件方面,小文件用传统IO,大文件用NIO。在处理网络连接方面,优先选择NIO。
对性能有点要求的服务器侧的网络,必须用NIO。 对网络连接数量上没有要求的客户端程序,建议还是IO,开发调试起来比较快一点。
gaofuqi 2015-03-13
  • 打赏
  • 举报
回复
看具体的应用场景吧。主要是区别是一个是异步IO(NIO),一个是同步IO(传统IO)。 至于是流方式比较快还是块方式比较快,这个没有测试过,普遍的理论都认为是块方式比较快。 在读取文件方面,小文件用传统IO,大文件用NIO。在处理网络连接方面,优先选择NIO。
skgary 2015-03-13
  • 打赏
  • 举报
回复
引用 7 楼 Foxir 的回复:
[quote=引用 6 楼 skgary 的回复:]显然,一次中断不会只读一个字。
抱歉,确实错了。 一次中断,确实不是一个字,但是CPU读取一次数据是一个字。 一次中断,一般是一个磁盘缓冲区塞满。 但CPU读磁盘缓冲区中的数据是一个字一个字读的,而DMA传输数据一次就是一个磁盘缓冲区。 还是NIO快。 [/quote] 其实,我想告诉你的事情是,nio相对于io来说,得到最关键的提升还是异步IO在网络处理性能上的。 而中断和CPU读数据,是两件事。
日知己所无 2015-03-13
  • 打赏
  • 举报
回复
还是自己写一段小程序测试一下来得快些
wyc_ 2015-03-12
  • 打赏
  • 举报
回复
多多交流
skgary 2015-03-12
  • 打赏
  • 举报
回复
引用 3 楼 Foxir 的回复:
[quote=引用 2 楼 skgary 的回复:] [quote=引用 楼主 cumtwyc 的回复:] java IO采用数组的方式读写与java nio采用缓冲区的方式读写哪个效率更高呢?
没区别。 io/nio的主要区别在异步和同步的调用,性能差异主要在多连接的处理上。[/quote] 没区别的判定太武断了。 从理论上来说,传统的io用的是设备中断方式,读写数据是以「字」为单位的(注意是字,不是字节),一般来说64位系统,中断一次也就能读1个字;如果使用nio方式,Java会尽量使用贴近操作系统的,更优化的方式,比如DMA方式,或者通道方式,去读写数据,这样的话,处理至少是以块为单位的,并且CPU基本上处于放权的状态,直到数据全部加载进内存,CPU才会去要回控制权。 所以在现代操作系统中,一般NIO都会比IO快。[/quote] 个人认为,你写的这段还需要再回炉重新学习一下相关的理论知识,尤其是你说的那个一般来说那一句话。 实际上来说,程序的效率更多取决于程序员的水平和实际的业务场景。具体用不用nio,看是不是有这个必要。
Foxir 2015-03-12
  • 打赏
  • 举报
回复
引用 6 楼 skgary 的回复:
显然,一次中断不会只读一个字。
抱歉,确实错了。 一次中断,确实不是一个字,但是CPU读取一次数据是一个字。 一次中断,一般是一个磁盘缓冲区塞满。 但CPU读磁盘缓冲区中的数据是一个字一个字读的,而DMA传输数据一次就是一个磁盘缓冲区。 还是NIO快。
skgary 2015-03-12
  • 打赏
  • 举报
回复
引用 5 楼 Foxir 的回复:
「一般来说」的说法,是因为现代操作系统大多都提供DMA和通道方式去读写块式设备,但是不排除某些操作系统不支持,或者硬件不支持。而且Java也只是说尽可能贴近操作系统的实现去做NIO,它也不保证。所以我使用了「一般来说」这个用词。 还有,不要动不动就让人「回炉学习」,你至少得贴一个说得过去的理由吧。 实际上这部分,你在转移话题。就题主给的问题来说,NIO确实比IO有优势,尤其是处理大块数据的时候。
显然,一次中断不会只读一个字。
Foxir 2015-03-12
  • 打赏
  • 举报
回复
引用 4 楼 skgary 的回复:
[quote=引用 3 楼 Foxir 的回复:] [quote=引用 2 楼 skgary 的回复:] [quote=引用 楼主 cumtwyc 的回复:] java IO采用数组的方式读写与java nio采用缓冲区的方式读写哪个效率更高呢?
没区别。 io/nio的主要区别在异步和同步的调用,性能差异主要在多连接的处理上。[/quote] 没区别的判定太武断了。 从理论上来说,传统的io用的是设备中断方式,读写数据是以「字」为单位的(注意是字,不是字节),一般来说64位系统,中断一次也就能读1个字;如果使用nio方式,Java会尽量使用贴近操作系统的,更优化的方式,比如DMA方式,或者通道方式,去读写数据,这样的话,处理至少是以块为单位的,并且CPU基本上处于放权的状态,直到数据全部加载进内存,CPU才会去要回控制权。 所以在现代操作系统中,一般NIO都会比IO快。[/quote] 个人认为,你写的这段还需要再回炉重新学习一下相关的理论知识,尤其是你说的那个一般来说那一句话。 实际上来说,程序的效率更多取决于程序员的水平和实际的业务场景。具体用不用nio,看是不是有这个必要。[/quote] 「一般来说」的说法,是因为现代操作系统大多都提供DMA和通道方式去读写块式设备,但是不排除某些操作系统不支持,或者硬件不支持。而且Java也只是说尽可能贴近操作系统的实现去做NIO,它也不保证。所以我使用了「一般来说」这个用词。 还有,不要动不动就让人「回炉学习」,你至少得贴一个说得过去的理由吧。 实际上这部分,你在转移话题。就题主给的问题来说,NIO确实比IO有优势,尤其是处理大块数据的时候。
Foxir 2015-03-11
  • 打赏
  • 举报
回复
引用 2 楼 skgary 的回复:
[quote=引用 楼主 cumtwyc 的回复:] java IO采用数组的方式读写与java nio采用缓冲区的方式读写哪个效率更高呢?
没区别。 io/nio的主要区别在异步和同步的调用,性能差异主要在多连接的处理上。[/quote] 没区别的判定太武断了。 从理论上来说,传统的io用的是设备中断方式,读写数据是以「字」为单位的(注意是字,不是字节),一般来说64位系统,中断一次也就能读1个字;如果使用nio方式,Java会尽量使用贴近操作系统的,更优化的方式,比如DMA方式,或者通道方式,去读写数据,这样的话,处理至少是以块为单位的,并且CPU基本上处于放权的状态,直到数据全部加载进内存,CPU才会去要回控制权。 所以在现代操作系统中,一般NIO都会比IO快。
skgary 2015-03-11
  • 打赏
  • 举报
回复
引用 楼主 cumtwyc 的回复:
java IO采用数组的方式读写与java nio采用缓冲区的方式读写哪个效率更高呢?
没区别。 io/nio的主要区别在异步和同步的调用,性能差异主要在多连接的处理上。
Foxir 2015-03-11
  • 打赏
  • 举报
回复
bio是流式的,看源码你会发现,最终都调用read()方法,也就是一个字节一个字节地读; nio是块式的,一块一块地读写。 操作系统的文件系统是块式的,所以一般来说,nio更快。

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧