高吞吐量系统(2)

使用缓冲组件对文件 I/O 进行包装,可以有效提高文件 I/O 的性能。

清单 3. 示例代码 import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class StreamVSBuffer { public static void streamMethod() throws IOException{ try { long start = System.currentTimeMillis(); //请替换成自己的文件 DataOutputStream dos = new DataOutputStream( new FileOutputStream("C://StreamVSBuffertest.txt")); for(int i=0;i<10000;i++){ dos.writeBytes(String.valueOf(i)+"/r/n");//循环 1 万次写入数据 } dos.close(); DataInputStream dis = new DataInputStream(new FileInputStream("C://StreamVSBuffertest.txt")); while(dis.readLine() != null){ } dis.close(); System.out.println(System.currentTimeMillis() - start); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void bufferMethod() throws IOException{ try { long start = System.currentTimeMillis(); //请替换成自己的文件 DataOutputStream dos = new DataOutputStream(new BufferedOutputStream( new FileOutputStream("C://StreamVSBuffertest.txt"))); for(int i=0;i<10000;i++){ dos.writeBytes(String.valueOf(i)+"/r/n");//循环 1 万次写入数据 } dos.close(); DataInputStream dis = new DataInputStream(new BufferedInputStream( new FileInputStream("C://StreamVSBuffertest.txt"))); while(dis.readLine() != null){ } dis.close(); System.out.println(System.currentTimeMillis() - start); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args){ try { StreamVSBuffer.streamMethod(); StreamVSBuffer.bufferMethod(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

运行结果如清单 4 所示。

清单 4. 运行输出 889 31

很明显使用缓冲的代码性能比没有使用缓冲的快了很多倍。清单 5 所示代码对 FileWriter 和 FileReader 进行了相似的测试。

清单 5.FileWriter 和 FileReader 代码 import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class WriterVSBuffer { public static void streamMethod() throws IOException{ try { long start = System.currentTimeMillis(); FileWriter fw = new FileWriter("C://StreamVSBuffertest.txt");//请替换成自己的文件 for(int i=0;i<10000;i++){ fw.write(String.valueOf(i)+"/r/n");//循环 1 万次写入数据 } fw.close(); FileReader fr = new FileReader("C://StreamVSBuffertest.txt"); while(fr.ready() != false){ } fr.close(); System.out.println(System.currentTimeMillis() - start); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void bufferMethod() throws IOException{ try { long start = System.currentTimeMillis(); BufferedWriter fw = new BufferedWriter(new FileWriter("C://StreamVSBuffertest.txt"));//请替换成自己的文件 for(int i=0;i<10000;i++){ fw.write(String.valueOf(i)+"/r/n");//循环 1 万次写入数据 } fw.close(); BufferedReader fr = new BufferedReader(new FileReader("C://StreamVSBuffertest.txt")); while(fr.ready() != false){ } fr.close(); System.out.println(System.currentTimeMillis() - start); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args){ try { StreamVSBuffer.streamMethod(); StreamVSBuffer.bufferMethod(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

运行输出如清单 6 所示。

清单 6. 运行输出 1295 31

从上面例子可以看出,无论对于读取还是写入文件,适当地使用缓冲,可以有效地提升系统的文件读写性能,为用户减少响应时间。

缓存

缓存也是一块为提升系统性能而开辟的内存空间。缓存的主要作用是暂存数据处理结果,并提供下次访问使用。在很多场合,数据的处理或者数据获取可能会非常费时,当对这个数据的请求量很大时,频繁的数据处理会耗尽 CPU 资源。缓存的作用就是将这些来之不易的数据处理结果暂存起来,当有其他线程或者客户端需要查询相同的数据资源时,可以省略对这些数据的处理流程,而直接从缓存中获取处理结果,并立即返回给请求组件,以此提高系统的响应时间。

目前有很多基于 Java 的缓存框架,比如 Ehcache、OSCache 和 JBossCache 等。EHCache 缓存出自 Hibernate,是其默认的数据缓存解决方案;OSCache 缓存是有 OpenSymphony 设计的,它可以用于缓存任何对象,甚至是缓存部分 JSP 页面或者 HTTP 请求;JBossCache 是由 JBoss 开发、可用于 JBoss 集群间数据共享的缓存框架。

以 EHCache 为例,EhCache 的主要特性有:

快速;

简单;

多种缓存策略;

缓存数据有两级:内存和磁盘,因此无需担心容量问题;

缓存数据会在虚拟机重启的过程中写入磁盘;

可以通过 RMI、可插入 API 等方式进行分布式缓存;

具有缓存和缓存管理器的侦听接口;

支持多缓存管理器实例,以及一个实例的多个缓存区域;

提供 Hibernate 的缓存实现。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/00bb3cbe12d967967bc77e1009c7df48.html