网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 
中国网管联盟
Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道
 当前位置: > bitsCN.com > JAVA > 其它技术 > 优化JAVA性能  

优化JAVA性能

2003-05-14  作者:BitsCN整理  来源:中国网管联盟  点评 投稿 收藏


  添加较小的辅助性函数
  
    在最初版本的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代码对性能比较敏感,这一改进的意义是重大的。 网管bitscn_com
  
    这种技术带来的负作用是对象拥有的方法更多了,而且要获取同一种信息可以有多种方法,这就使文件变得相当大而且也更加复杂了,不利于用户采用这一技术。但是,象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类对象。
网管下载dl.bitscn.com

  
    结合二家之长
  
    一个更好的解决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不具备这样的特性。

网管u家u.bitsCN.com


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

TAGs   性能   优化   int   public   对象   调用   Point   创建      
 上一篇:CreateFileMapping的MSDN翻译和使用心得   下一篇:在运行时刻更新功能模块
相关文章列表
优化JAVA性能 评论:
loading.. 评论加载中…
评论:请自觉遵守互联网相关政策法规,评论不得超过250字。

验证码: 注册用户
本类热门排行:
1.JACOB配置方法及两个常见错误解决
2.用java api进行sort
3.Java中this、super用法简谈
4.Class文件详解 (2)
5.Apache目录服务器中存储Java对象
6.Java 操作二维数组实例
7.Lucene 索引文件格式的规格定义
8.英文打字练习
9.Java如何共享资源
10.editplus能够编译java嘛? 如何设置
最新推荐文章:
1.J2SE实现windows读取网卡的物理地址
2.使用Jetty和DWR创建伸缩性Comet程序
3.经验分享:我的20天项目经历
4.实现Java跨平台运行的十二个注意事项
5.成功的必要条件:开源思想推动创新
6.100行Java代码构建一个线程池
7.用Stripes做Java Web开发
8.j2me创意--Wap浏览器的源代码
9.使用Hashtable对字符串进行碰撞
10.定制 bugzilla 进行项目管理
网管论坛交流:
·不疯魔不成活
·令你大开眼界的真正标准化机房,已整理重
·为赈灾,女孩舍身拍“裸照”
·Windows Server 2003服务器群集创建和配
·exchange2k3全套官方资料
·双儿一周岁了。。。特殊的礼物来啦。。
·存储备份技术版块守则
·无盘技术交流区守则
·DOS命令基础大全之命令详解<作者吐血
·Windows XP 操作系统默认设置需要注意的