Java程序性能优化-缓冲(Buffer)(2)[1]
Java程序性能优化-缓冲(Buffer)(2)[1]
缓冲(Buffer)( )
其中 第 个构造函数允许在应用层指定缓冲区的大小 第 个构造函数将构造大小为 K的缓冲区 一般来说 缓冲区不宜过小 过小的缓冲区无法起到真正的缓冲作用 缓冲区也不宜过大 过大的缓存区会浪费系统内存 增加GC负担 在本例中 设置循环次数CIRCLE为 万 若不使用缓冲区操作 则相对耗时 ms;而使用缓冲区的FileWriter仅相对耗时 ms 性能提升一倍
另一个有用的缓冲组件是BufferedOutputStream 在前文 装饰者模式 一节中 已经提到 使用BufferedOutputStream可以包装所有的OutputStream 为其提供缓冲功能 提高输出流的效率 和BufferedWriter类似 它也提供了两个构造函数
public BufferedOutputStream(OutputStream out)
public BufferedOutputStream(OutputStream out int size)
第 个构造函数可以指定缓冲区大小 默认情况下 和BufferedWriter一样 缓冲区大小为 K
此外 在本书第 章中还将详细介绍JDK的NIO缓存 NIO的Buffer类族 提供了更为强大和专业的缓冲区控制功能 有兴趣的读者可以仔细阅读第 章中的相关内容
除了能够改善I/O性能 缓冲区对任何一种上下层组件存在性能差异的场合都可以起到很好的效果 另一个典型的例子是使用缓冲区提升动画显示效果 下例 实现了一个左右平移的圆球
public class NoBufferMovingCircle extends JApplet implements Runnable {
Image screenImage = null;
Thread thread;
int x = ;
int move = ;
public void init() {
screenImage = createImage( )
}
public void start() {
if (thread == null) {
thread = new Thread(this)
thread start()
}
}
public void run() {
try {
while (true)
{
x += move;
if ((x > ) || (x < ))
move *= ;
repaint()
Thread sleep( )
}
} catch (Exception e) {
}
}
public void drawCircle(Graphics gc) {
Graphics D g = (Graphics D) gc;
g setColor(Color GREEN)
g fillRect( )
g setColor(Color red)
g fillOval(x )
![Java程序性能优化-缓冲(Buffer)(2)[1]](http://img.zhputi.com/uploads/cbcd/cbcd76263de201ed2a492e4d96ee5027117941.jpg)
}
public void paint(Graphics g) { //画一个圆
g setColor(Color white) //这里没有缓冲
g fillRect( )
drawCircle(g)
}
}
以上代码没有main()函数 但在Eclipse中 可以通过右键菜单中 Run As下的Java Applet运行 结果显示 虽然程序可以完成红球的左右平移 但是效果较差 因为每次的界面刷新都涉及图片的重新绘制 而这是较为费时的操作 因此 画面的抖动和白光效果明显 为了能得到更优质的显示效果 可以为它加上缓冲区
lishixinzhi/Article/program/Java/gj/201311/27805