浅析Java程序IO性能改进策略.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
浅析Java程序IO性能改进策略

浅析Java程序IO性能改进策略   摘 要:程序的I/O性能是影响程序性能的关键之一。有效地使用缓冲机制可以极大地提高程序的I/O性能。本文首先对java.io包做了一个简要的介绍,指出导致I/O性能低下的根本原因,然后循序渐进地采取了三种策略,逐步将I/O性能提高到168倍,这三种策略分别是采用缓冲流,定制自己的缓冲区,定制静态的固定长度的缓冲区。   关键词:I/O性能;流;缓冲区;分配和回收   中图分类号:TP311 文献标识码:A   Java应用程序都会经常使用java.io包,例如磁盘文件读写和通过网络传输数据。然而初学者由于对java.io包的理解的局限性导致编写的程序I/O性能很差。所幸的是,只要对java.io包有了很好的理解,就可以杜绝这方面的问题,从而保证程序拥有较好的I/O性能。   本文首先对java.io包做一个简要的介绍,然后指出导致I/O性能低下的根本原因是没有采用缓冲机制,然后循序渐进地采???了三种策略,将I/O性能逐步提高到168倍,这三种策略分别是采用缓冲流,定制自己的缓冲区,定制静态的固定长度的缓冲区。   1 I/O操作的基本概念   在Java I/O中最基本的概念是流(Stream),流是一个连续的字节序列,包括输入流和输出流,输入流用来读取这个序列,而输出流则用来写这个序列,在默认情况下Java的流操作是基于字节的,即一次只读或只写一个字节。   java.io包提供了InputStream和OutputStream作为对I/O操作的抽象,这两个接口决定了类层次结构的基本格局。InputStream和OutputStream的具体实现类提供了对不同数据源的访问,如磁盘文件和网络连接。   java.io包还提供了过滤流(Filter Stream),过滤流并不指向具体的数据源,而是在其他流之上进行了包装,这些过滤流其实是java.io包的核心。从性能的角度来看,最重要的过滤流是缓冲流(Buffered Stream),图1显示了一个简化的类层次结构图。   2 缓冲流   导致I/O性能低下的主要原因是没有对I/O操作进行缓冲。众所周知,硬盘擅长于大块数据的读写,但是在小量数据的读写上性能不好,所以,为了最大化I/O性能,我们应该选择批量的数据操作,而缓冲流正是为这个目的设计的。缓冲流,包括BufferedInputStream和BufferedOutputStream, 它为I/O流增加了内存缓冲区,使得Java程序一次可以向底层设备写入或者读取大量数据,从而提高了程序的性能。   为了更好地理解缓冲流的效果,请阅读程序清单一,这个例子采用了原始的文件流实现文件的拷贝。copy方法打开了一个FileInputStream 和一个FileOutputStream,并将数据从一个流直接拷贝到另一个流。由于read和write方法是基于字节的,所以实际的磁盘读写也是按字节发生的。实践证明使用这段代码拷贝一个8M的文本文件需要花费36750ms。   程序清单一中的copy方法只需稍作修改就能有效地改善性能,如程序清单二所示,它在原始的文件流之上采用了缓冲流BufferedInputStream和BufferedOutputStream,缓冲流将每一个小的读写请求积攒起来,然后一次性地批处理,通常是将几千个读写请求合并成一个大的请求。改进后的copy方法拷贝一个8M的文本文件需要花费1187ms,性能大约提高了31倍。   3 建立自己的缓冲   缓冲流虽然在它的内部增加了内存缓冲区,使得在缓冲区和底层设备之间写入或读取大量数据成为可能[2,3],但是在这之上Java程序仍旧使用while循环从该流(实际上是缓冲数组)按字节读写数据。由于缓冲数组的大小是一定的,JVM需要针对数组做越界检查,该操作会导致额外的系统开销。另一方面,为了支持多线程环境,将数据从BufferedInputStream的缓冲数组拷贝到BufferedOutputStream的缓冲数组,其中的方法调用很多都是synchronized, 这也会导致额外的系统开销。所以尽管程序清单二所示代码可以有效地改善性能,但是改善的程度仍然不尽人意。   还是利用硬盘擅长读写大块数据这一特性,我们可以自己建立缓冲,以避免上述额外的系统开销。这需要使用InputStream和OutputStream提供的两个重载方法,它们允许按字节读写,也可以按字节数组读写,如下所示:   public int read();   public int read(byte[] bytes);   public int write();   public int write(byte[] bytes)

文档评论(0)

3471161553 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档