欢迎来到天天文库
浏览记录
ID:14751032
大小:53.00 KB
页数:17页
时间:2018-07-30
《调整javatmio性能》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、调整JavaTMIO性能论文索引调整JavaTMI/O性能GlenMcCluskey翻译:cherami这篇文章讨论和阐明了提供JavaTMI/O性能的多种技术。大多技术围绕调整磁盘文件I/O,但是有些内容也同样适合网络I/O和窗口输出。第一部分技术讨论底层的I/O问题,然后讨论诸如压缩,格式化和串行化等高级I/O问题。然而这个讨论没有包含应用设计问题,例如搜索算法和数据结构,也没有讨论系统级的问题,例如文件高速缓冲。当我们讨论JavaI/O时,值得注意的是Java语言采取两种截然不同的磁盘文件结构。一个是基于字节流,另一个是字符序列。在Java语言中一个字符有两个字节
2、表示,而不是像通常的语言如c语言那样是一个字节。因此,从一个文件读取字符时需要进行转换。这个不同在某些情况下是很重要的,就像下面的几个例子将要展示的那样。低级I/O问题加速I/O的基本规则缓冲读写文本文件格式化的代价随机访问高级I/O问题压缩高速缓冲分解串行化获取文件信息更多信息加速I/O的基本规则作为这个讨论的开始,这里有几个如何加速I/O的基本规则:避免访问磁盘避免访问底层的操作系统避免方法调用避免个别的处理字节和字符很明显这些规则不能在所有的问题上避免,因为如果能够的话就没有实际的I/O被执行。考虑下面的计算文件中的新行符('')的三部分范例。方法1:read
3、方法第一个方法简单的使用FileInputStream的read方法:importjava.io.*;publicclassintro1{publicstaticvoidmain(Stringargs[]){if(args.length!=1){System.err.println("missingfilename");System.exit(1);}try{FileInputStreamfis=newFileInputStream(args[0]);intcnt=0;intb;while((b=fis.read())!=-1){if(b=='')cnt++;}fi
4、s.close();System.out.println(cnt);}catch(IOExceptione){System.err.println(e);}}}然而这个方法触发了大量的底层运行时系统调用--FileInputStream.read--返回文件的下一个字节的本机方法。方法2:使用大缓冲区第二种方法使用大缓冲区避免了上面的问题:importjava.io.*;publicclassintro2{publicstaticvoidmain(Stringargs[]){if(args.length!=1){System.err.println("missingfi
5、lename");System.exit(1);}try{FileInputStreamfis=newFileInputStream(args[0]);BufferedInputStreambis=newBufferedInputStream(fis);intcnt=0;intb;while((b=bis.read())!=-1){if(b=='')cnt++;}bis.close();System.out.println(cnt);}catch(IOExceptione){System.err.println(e);}}}BufferedInputStream.r
6、ead从输入缓冲区获取下一个字节,仅仅只访问了一次底层系统。方法3:直接缓冲第三种方法避免使用BufferedInputStream而直接缓冲,因此排除了read方法的调用:importjava.io.*;publicclassintro3{publicstaticvoidmain(Stringargs[]){if(args.length!=1){System.err.println("missingfilename");System.exit(1);}try{FileInputStreamfis=newFileInputStream(args[0]);bytebuf[
7、]=newbyte[2048];intcnt=0;intn;while((n=fis.read(buf))!=-1){for(inti=0;i
此文档下载收益归作者所有