Java NIO 第一章 介绍(2)

来源:互联网 发布:库里2.5孙悟空淘宝 编辑:程序博客网 时间:2024/05/01 12:35

1.2 没有CPU限制

 

       从某些程度上说,可以原谅Java程序员将主要精力放在CPU效率上的优化而没有对IO效率做过多的考虑。在Java早期,Java虚拟机解释字节码是很少甚至不对字节码做运行时优化的。这就意味着那时候Java程序比本地编译过的代码运行的慢得多,也很少需要调用操作系统的IO子系统。

 

       但是运行时优化已经有了极大的进步。现在的虚拟机对字节码的执行速度可以与本地编译的代码相提并论,有时候因为动态运行时优化做的足够好,它甚至比本地代码更快。这意味着大多数Java程序不受CPU的限制,反而经常受到IO的限制。

 

       大多数情况下,如果考虑到操作系统并不是一直传递数据来使Java程序忙碌,那对Java程序来说IO也不是没有限制。但是,Java虚拟机现在并没有高效的使用IO。操作系统的IO结构和Java基于流的IO模型存在着一定的不匹配性。操作系统喜欢在DMA硬件的帮助下使用大的块来传递数据。而Java虚拟机的操控类却喜欢使用像少许字节、几行文本这样小块数据。也就是说当操作系统传递给虚拟机包括大量数据的一个缓冲区时,java.io包中的stream类将这些数据花了大量的时间分解成小块,通常还伴随着复制这些小块到许多由对象组成的抽象层。打个比方,操作系统使用卡车运输数据,然后java.iostream类将数据用铲子铲下来。NIO可以使卡车立即返回,而直接使用卸下来的数据(一个叫做ByteBuffer的对象就可以做到这样)。

 

       也不是说传统的IO模型就没有传送大量数据的可能。它过去能,现在也一样能。如果你坚持使用基于数组的read()write()方法,特别是像RandomAccessFile的类也会非常的高效。虽然这些基于数组的方法非常接近操作系统的系统调用(System-Call),但是也必须至少复制一次缓冲区。

 

       就像表1-1列举的一样,如果你发现你的代码大部分时间在等待IO,那么你就要考虑优化IO性能了。否则你那些精心雕琢的代码大部分时间都处于空闲状态。

原创粉丝点击