【设计优化】-使用缓冲(Buffer)提高程序性能
缓冲区是一块特定的内存区域。开辟缓冲区的目的是通过缓解应用程序上下层之间的性能差异,提高系统性能。
缓冲能够协调上层组件和下层组件的性能差异。当上层组件性能因为下层组件时,能够有效地降低上层组件对下层组件的等待时间。比如,在操作系统中,为了改善 CPU 与 I/O 设备速度不匹配的矛盾,设置了缓冲区,程序输出的数据先送到缓冲区暂存,然后由I/O 设备慢慢地处理。这时,CPU不必等待,能够继续运行程序。实现了CPU与I/O设备之间的并行工作。其实,凡在数据的到达速率与其离去速率不同的地方,都可设置缓冲,以缓和它们之间速度不匹配的矛盾。
缓冲最经常使用的场景就是提高 I/O 速度。为此 JDK 内不少 I/O 组件都提供了缓冲功能。比方,使用 FileWriter时,进行文件写操作的代码例如以下:
public class BufferTest {
public static final int CIRCLE = 100000;
public static void test1() throws Exception {
Writer writer = new FileWriter(new File("file1.txt"));
for (int i = 0; i < CIRCLE; i++) {
writer.write(i);
}
writer.close();
}
public static void test2() throws Exception {
Writer writer = new BufferedWriter(
new FileWriter(new File("file2.txt")));
for (int i = 0; i < CIRCLE; i++) {
writer.write(i);
}
writer.close();
}
public static void main(String[] args) throws Exception {
test1();
test2();
}
}
test1() 使用普通的 FileWriter 类进行写文件,而 test2() 使用 BufferedWriter 为 FileWriter 对象添加�了缓存功能。
BufferedWriter 有两个构造函数:
public BufferedWriter(Writer out)
public BufferedWriter(Writer out, int sz)
第一个构造函数将构造大小为 8K 的缓冲区。一般来说,缓冲区不宜过小,过小的缓冲区无法企到真正的缓冲作用,缓冲区也不易过大,过大的缓冲区会浪费系统内存,添加� GC 负担。
第二个构造函数同意手动指定缓冲区大小。
分别执行两个方法,使用 TPTP 分析执行时间:
能够观察到,使用了缓冲区和未使用缓冲区的写文件花费的时间相差有 3~5 倍之多。
还有一个实用的缓冲组件是 BufferedOutputStream。使用 它能够包装全部的 OutputStream , 为其提供缓冲功能,提高输出流的效率。和BufferedWriter 类似,它也提供了两个构造函数
public BufferedOutputStream(OutputStream out)
public BufferedOutputStream(OutputStream out, int size)
作用类似于上文提到的 BufferedWriter 。
除了能够改善 I/O 性能,缓冲区对不论什么一种上下层组件存在性能差异的场合都能够得到非常好的效果。比如绘图类程序,能够使用内存缓冲区,先在内存中绘图,然后一次性显示出整个图像。
除了性能上的优化,缓冲区还能够作为上层组件和下层组件的一种通信工具。从而将上层和下层组件解耦,优化设计结构。比如使用生产者消费者模式,连接生产者和消费者的缓冲区。
【设计优化】-使用缓冲(Buffer)提高程序性能的更多相关文章
- [.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(三) 利用多线程提高程序性能(下)
[.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(二) 利用多线程提高程序性能(下) 本节导读: 上节说了线程同步中使用线程锁和线程通知的方式来处理资源共享问题,这 ...
- [.net 面向对象程序设计进阶] (17) 多线程(Multithreading)(二) 利用多线程提高程序性能(中)
[.net 面向对象程序设计进阶] (17) 多线程(Multithreading)(二) 利用多线程提高程序性能(中) 本节要点: 上节介绍了多线程的基本使用方法和基本应用示例,本节深入介绍.NET ...
- [.net 面向对象程序设计进阶] (16) 多线程(Multithreading)(一) 利用多线程提高程序性能(上)
[.net 面向对象程序设计进阶] (16) 多线程(Multithreading)(一) 利用多线程提高程序性能(上) 本节导读: 随着硬件和网络的高速发展,为多线程(Multithreading) ...
- asp.net提高程序性能的技巧(一)
[摘 要] 我只是提供我几个我认为有助于提高写高性能的asp.net应用程序的技巧,本文提到的提高asp.net性能的技巧只是一个起步,更多的信息请参考<Improving ASP.NET Pe ...
- Matlab优化存储器读写来改善程序性能
最近用Matlab写程序的时候终于遇到了程序执行效率的问题,于是在Google上面搜索了一篇提高代码性能的文章,简单的概括一下. 文章是通过优化寄存器读写来提高执行速度的,主要体现在三个方面: 在做循 ...
- Spring MVC 异步处理请求,提高程序性能
原文:http://blog.csdn.net/he90227/article/details/52262163 什么是异步模式 如何在Spring MVC中使用异步提高性能? 一个普通 Servle ...
- .Net Core中使用ref和Span<T>提高程序性能
一.前言 其实说到ref,很多同学对它已经有所了解,ref是C# 7.0的一个语言特性,它为开发人员提供了返回本地变量引用和值引用的机制. Span也是建立在ref语法基础上的一个复杂的数据类型,在文 ...
- .NET程序性能优化的基本要领
Bill Chiles(Roslyn编译器的程序经理)写了一篇文章<Essential Performance Facts and .NET Framework Tips>,知名博主寒江独 ...
- .NET程序性能优化基本要领
想了解更多关于新的编译器的信息,可以访问 .NET Compiler Platform ("Roslyn") 基本要领 在对.NET 进行性能调优以及开发具有良好响应性的应 ...
随机推荐
- Android studio导入第三方类库
1.开发过程中想要导入第三方类库和Eclipse也是有差别的,我们导入SlidingMenu这个类库,从github上下载下来解压到项目目录下. 2.然后我们重启我们的android studio就会 ...
- 总结showModalDialog在开发中的一些问题
一.在页面调用window.open()函数后,可以直接在打开的页面中用window.opener来调用父页面的方法,然而如果用showModalDialog打开一个模态窗口,就不能通过window. ...
- 执行Asp.net应用程序在Linux上的3种托管方式
执行Asp.net应用程序在Linux上的3种托管方式 想要执行Asp.net应用程序在Linux上.我们有3种选择: 1.使用Apache作为Webserver.使用mod_mono:http:// ...
- 【LeetCode】Min Stack 解题报告
[题目] Design a stack that supports push, pop, top, and retrieving the minimum element in constant tim ...
- eclipse设置关联文件打开方式
window->preferences: General->Editors->File Associations
- XML实例文档
from: http://www.w3school.com.cn/xpath/xpath_examples.asp XML实例文档 我们将在下面的例子中使用这个 XML 文档: "books ...
- python - ImportError: No module named http.cookies error when installing cherrypy 3.2 - Stack Overflow
python - ImportError: No module named http.cookies error when installing cherrypy 3.2 - Stack Overfl ...
- Graphviz 绘制流程图
凝视说明非常具体.不再详述. digraph G{ //dot 是一种画图语言,它能够方便你採用图形的方式高速.直观地表达一些想法, //比方描写叙述某个问题的解决方式,构思一个程序的流程,澄清一堆貌 ...
- cocos2d-x CCNode类
文章引用自http://blog.csdn.net/qiurisuixiang/article/details/8763260 1 CCNode是cocos2d-x中一个非常重要的类.CCNode是场 ...
- Flex中的DataGrid报错(二)
1.错误描写叙述 此行的多个标记: -holeNum -1067: String 类型值的隐式强制指令的目标是非相关类型 mx.controls:Text. 2.错误原因 将字符串类型赋值给Text ...