【设计优化】-使用缓冲(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 性能,缓冲区对任何一种上下层组件存在性能差异的场合都可以得到很好的效果。例如绘图类程序,可以使用内存缓冲区,先在内存中画图,然后一次性显示出整个图像。

除了性能上的优化,缓冲区还可以作为上层组件和下层组件的一种通信工具。从而将上层和下层组件解耦,优化设计结构。例如使用生产者消费者模式,连接生产者和消费者的缓冲区。

时间: 2024-11-13 22:52:05

【设计优化】-使用缓冲(Buffer)提高程序性能的相关文章

C++应用程序性能优化(一)——应用程序性能优化简介

C++应用程序性能优化(一)--应用程序性能优化简介 一.程序性能优化简介 1.程序性能优化简介 在计算机发展的早期阶段,硬件资源相对而言是非常昂贵的,CPU运行时间与内存容量给程序开发人员设置了极大限制.因此,早期的程序对运行性能和内存空间占用的要求是非常严格的,很多开发人员为了减少1%的CPU运行时间,为减少几十个甚至几个字节而不懈努力.随着计算机技术的快速发展,硬件资源变得相对便宜.但如果认为软件开发时,程序的性能优化不再重要,硬件将解决性能问题也是片面的.计算机硬件的发展解决了部分软件的

OutputCache缓存优化asp.net代码 提高网页性能

对于asp.net编写的网页来说,使用缓存是一种非常重要也是很常用的优化技术,它可以大大减轻服务器的负载压力,优化这些网页的性能,在网与使用 .NET Framework 的任何其他功能相比,适当地使用缓存可以更好地提高站点的性能.同时,在网页加速显示上也起了很大的作用. OutputCache以声明的方式控制 ASP.NET 页或页中包含的用户控件的输出缓存策略. 语法: <%@ OutputCache Duration="#ofseconds"   Location=&quo

[.net&#160;面向对象程序设计进阶]&#160;(16)&#160;多线程(Multithreading)(一) 使用多线程提高程序性能

[.net 面向对象程序设计进阶] (16) 多线程(Multithreading)(一) 使用多线程提高程序性能 本节导读: 多线程(Multithreading)使我们程序可以同时进行多任务处理,直接提高了程序的执行效率,学习多线程对提高程序运行能力非常必要,本节主要介绍多线程原理及.NET中多线程的应用. 1. 关于多线程 在介绍多线程之前,先了解一下进程. 进程:独立运行的程序称为进程.(比如Windows系统后台程序,也可以称为后台进程) 线程:对于同一个程序分为多个执行流,称为线程.

[.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(三) 利用多线程提高程序性能(下)

[.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(二) 利用多线程提高程序性能(下) 本节导读: 上节说了线程同步中使用线程锁和线程通知的方式来处理资源共享问题,这些是多线程的基本原理. .NET 4.0以后对多线程的实现变得更简单了. 本节主要讨论.NET4.0多线程的新特性——使用Task类创建多线程. 读前必备: A. LINQ使用  [.net 面向对象编程基础] (20) LINQ使用 B. 泛型          [.net 面向对象编程基础] (

asp.net提高程序性能的技巧(一)

[摘 要] 我只是提供我几个我认为有助于提高写高性能的asp.net应用程序的技巧,本文提到的提高asp.net性能的技巧只是一个起步,更多的信息请参考<Improving ASP.NET Performance>一书. 1. 数据库访问性能优化 数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源.ASP.NET中提供了连接池(Connection Pool)改善打开和关闭数据库对性能的影响.系统将用户

使用jdk的jps、jstack工具检测代码问题,提高程序性能

?? 今天给大家分享怎样利用jdk的jps和jstack工具结合定位代码的问题,提高程序的稳定性.健壮性和性能. 在jdk的bin,目录下面有很多的工具如图: jps.jstack工具介绍: jps: 是JDK1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上简单察看当前java进程的一些简单情况. 命令格式:jps [options ] [ hostid ] [options]选项 : -q:仅输出VM标识符,不包括classname,jar

【设计优化】-使用缓存(Cache)提高程序性能

        缓存(Cache)就是一块用来存放数据的内存空间.主要作用是暂存数据处理结果,并提供下次访问使用.         缓存的使用非常普遍,比如,浏览器都会在本地缓存页面,从而减少HTTP 的访问次数.又如服务器系统开发时,设计人员为一些核心的 API 加上缓存,从而提高系统的缓存时间.         最简单的缓存实现可以使用 HashMap .当然,这样做会有很多问题,如何时清理无效的数据:如何防止缓存数据过多而导致内存溢出等.一个稍好的方案是使用 WeakHashMap,使用弱

gcc提高程序性能的几个参数

 -o3 -o1 -o2 这三个参数依据数字的增加性能提高越大,但是需要注意,用该参数进行提升性能,编译后的代码虽然性能提高,但是代码执行顺序也许和最初代码设计的顺序不一样. -funroll-loops gcc来检查代码,进行循环展开,减少循环次数提高性能 版权声明:本文为博主原创文章,未经博主允许不得转载.

优化SQL执行路径提高报表性能

报表出现性能问题需要对数据源计算进行优化时,执行路径难以确定从而被干预是阻碍报表优化的难题之一.由于数据库执行路径对开发人员不透明,报表优化需要指定执行路径时,程序员会很难甚至无法干预.而一般报表工具不具备强计算能力,大部分计算仍然要依靠数据库进行,这就导致很多报表优化效果不理想. 不同于一般报表工具,润乾集算报表内置了专门用于数据计算的集算引擎,开发人员可以通过编写集算脚本完成报表数据源准备.与数据库执行SQL路径不可控相比,集算脚本的执行过程是可控的,开发人员可根据实际情况编写或更改计算执行