网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.apache的Jakarta-ORO库 的正则表.
.JDBC 概述(三).
.为什么Java中继承是有害的.
.Java开发者XML基础全程详细讲解.
.在Struts中使用PlugIn扩展Hibern.
.分析用Javadoc形式集成文档的利与.
..Net里的哈希表和串行化的简单介.
.robbin 的 HttpSession 总结.
.java学习笔记7--Polymorphism.
.学习Jakarta Struts 1.1 (一).
.JAR进阶.
.Java动画编程基础第四部分.
.Java 2 新的焦点子系统.
.Kodo EJB:符合EJB3规范的持.
.漫谈Hibernate的前世今生.
.对等点如何彼此定位实现交互功能.
.Tomcat性能调整.
.手机游戏物理模型之——抛物线.
.struts1.1里的页面有效验证.
.JUnit实战篇 (一).

优化JAVA性能的几种方法

发表日期:2008-1-5


添加较小的辅助性函数

  在最初版本的Swing工具包中, 创建过多的Point、Rectangle和Dimension对象会严重地影响程序的性能。尽管一次在一个Point或Rectangle对象中返回多个值似乎更有效率,但这样作的代价要比调用多个方法高得多。在最近的Swing版本推出之前,这个问题可以通过简单地在组件或其他类中添加一些辅助性的方法得到改善,如下所示:

  public int getX() { return myBounds.x; }
  public int getY() { return myBounds.y; }
  public int getHeight() { return myBounds.height; }
  public int getWidth() { return myBounds.width; }

  现在,调用程序可以在不创建临时对象的情况下得到同样的结果,如下所示:

  int x = component.getX();
  int y = component.getY();
  int h = component.getHeight();
  int w = component.getWidth();

  原来的getBounds()仍然可以使用,较小的辅助性函数只不过提供了一种实现同样目标的效率更高的方法,其结果是,Rectangle的接口将完全暴露在组件的接口中。当修改Swing使之支持并可以使用这些较小的辅助性函数后,其结果是,Swing中的许多操作的运行速度都比原来快了二倍。由于GUI代码对性能比较敏感,这一改进的意义是重大的。

  这种技术带来的负作用是对象拥有的方法更多了,而且要获取同一种信息可以有多种方法,这就使文件变得相当大而且也更加复杂了,不利于用户采用这一技术。但是,象Swing的例子显示的那样,在对性能要求比较高的情况下,这种优化技术还是十分有效的。

  可变性的利用

  除了在组件中添加象上面讨论的getX()等具有简单数据类型值的临时函数外,Java 2还使用了其他的技术来减少在AWT和Swing中的对象创建活动。在组件和其他的GUI类中添加另一种版本的getBounds(),就可以在没有创建临时对象的前提上使调用程序得到象Rectangle类型的返回值:

  public Rectangle getBounds(Rectangle returnVal) {

   returnVal.x = myBounds.x;

   returnVal.y = myBounds.y;

   returnVal.height = myBounds.height;

   returnVal.width = myBounds.width;

   return returnVal;

  }

  调用程序仍然必须创建一个Rectangle对象,不过,可以在以后的调用中重用它。假如一个调用程序反复调用许多Component对象,就可以创建一个Rectangle对象并在每个Component中使用它。需要注重的是,这一技术只适用于可变的对象类型,不可能通过这种方式减少创建String类对象。

  结合二家之长

  一个更好的解决Point等简单类的对象创建问题的方法是使得Point类成为不可变的,然后再定义一个可变的子类,具体方法如下面的例子所示:

  public class Point {

   protected int x, y;

   public Point(int x, int y) { this.x = x; this.y = y; }

   public final int getX() { return x; }

   public final int getY() { return y; }

  }

  public class MutablePoint extends Point {

   public final void setX(int x) { this.x = x; }

   public final void setY(int y) { this.y = y; }

  }

  public class Shape {

   private MutablePoint myLocation;

   public Shape(int x, int y) { myLocation = new MutablePoint(x, y); }


   public Point getLocation() { return (Point) myLocation; }

  }

  在上面的例子中,Shape可以安全地返回myLocation的地址,因为调用程序假如试图修改这些域或调用他们的"调节器"就会返回一个出错信息。当然,调用程序仍然可以将Point转换为MutablePoint,但很明显这会带来不安全性,虽然调用程序也会得到它们所需要的返回值。)C++的开发人员会注重到,这一技术与C++中的返回一个Rectangle的常量地址(const Rectangle&)有点类似━━Java不具备这样的特性。

  在Java 1.3类库中的java.math.BigInteger类中,一个类无需创建新的对象就返回一个"只读的"对象。MutableBigInteger类不是公开的,它只供java.math类库内部使用。但由于BigInteger类中的一些方法(例如gcd())是由许多的算术操作组成的,完成这些操作而无需创建临时对象将极大地改善程序的性能。


上一篇:在Java中用类装载框架控制类加载 人气:545
下一篇:在无线J2ME设备上实现超文本传输协议 人气:781
浏览全部Java的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐