网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
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,移动开发
本月文章推荐
.怎样学好JAVA的一些总结.
.Spring JDBC抽象框架简化Web数据.
.课程介绍(1):SL-110 初级Java语言.
.Java高级编程:使用打印服务API二.
.学习和使用继承时先要清楚的三点.
.情人碰面的问题.JAVA代码.
.通过 JAVA SWING 看透 MVC 设计模.
.使用ant编译打包应用程序.
.Java之旅 (6) 初始化和清理.
.CSA 现身说法.
.java截获标准输出.
.布尔逻辑运算符.
.CheckStyle 及其配置的详细解释.
.新基准下,微软.NET依旧胜出.
.Java 实现连接sql server 2000(.
.getUTCMinutes 方法.
.Java 编程技术中汉字问题的分析及.
.2. Building Model Components.
.JavaMail常见问题之发送邮件问题.
.通过 Java 如何实现 AES 密码算法.

Java性能设计

发表日期:2008-1-5


很多程序员在一开始并不注重性能的设计,只有当系统交付运行时,才 发现问题并且开始解决这一问题,但往往这只能拯救一点点。性能的治理应该一开始 就被整合到设计和开发当中去。

最普遍的问题就是临时对象大量经常的创建,这为性能埋下隐患。

性能的问题来自很多原因,最轻易解决的可能是:你选择了不好的算法来进行计算,如 用冒泡法来排序巨量数据,或者你每次使用数据时都要反复计算一次,这应该使用Cache。

你能很轻易的使用工具(如Borland的Optimizeit)或压力测试发现这些问题, 一旦发现,就能够立即被纠正,但是很多Java的性能问题隐藏得更深,难于修改源码就能纠正,如程序组件的接口设计。

现在我们倡导面向对象的组件可复用设计,无疑这样设计的优点是巨大的, 但是也要注重到对性能的影响。

一个java性能设计原则是,避免不必要的对象创建,对象的创建是非常耗时的, 所以你要避免不必要的临时或过多的对象创建,

String是程序中最主要创建的对象,因为String是不变的,假如String长度被修改 将导致String对象再次创建,所以对性能有所注重的一般人就是尽量回避使用String, 但是这几乎是不可能的。

接口参数设计

举例 MailBot:
MailBot邮件系统的有一个Header数据,它是character buffer,需要对这个character buffer 进行分析比较,那么你要做一个类Matcher,在这个类中你将Header数据读入然后配比,一个不好的做法是:

public class BadRegEXPMatcher {
  public BadRegExpMatcher(String regExp);

  /** Attempts to match the specified regular expression against the input     text, returning the matched text if possible or null if not
  */
  public String match(String inputText);

}

这个BadRegExpMatche要求入口参数是String ,那么假如MailBot要调用他,必须自己做一个 character buffer到String的转换:

BadRegExpMatcher dateMatcher = new BadRegExpMatcher(...);

while (...) { ...

//产生新的String
String headerLine = new String(myBuffer, thisHeaderStart, thisHeaderEnd-thisHeaderStart);

String result = dateMatcher.match(headerLine);

if (result == null) { ... }

}

很明显,这里这个由于接口不一致导致了多余的对象String headerline的创建,这是不能答应的, 应该将Matcher的接口设计成能够接纳character buffer,当然为通用性,也应该提供String的 接口参数:

class BetterRegExpMatcher {
  public BetterRegExpMatcher(...);

  /** 提供多个接口参数的match方法
  Provide matchers for multiple formats of input -- String,
  character array,   and subset of character array. Return
  -1 if no match was made; return offset of match start if
  a match was made. */
 
  public int match(String inputText);
  public int match(char[] inputText);
  public int match(char[] inputText, int offset, int length);

  /** Get the next match against the input text, if any */
  public int getNextMatch();

  public int getMatchLength();

  public String getMatchText();
}

很明显BetterRegExpMatcher的运行速度将比前面BadRegExpMatcher运行速度快。

因为在你已经写好代码的情况下,你比较难于更改一个类的接口参数,那就应该在写程序之前多 多考虑你这些接口参数的类型设定,最好有一个通盘的接口类型规定。

减少对象的创建

临时对象是那些有很短的生命周期,通常服务一些非十分有用的目标,程序员通常使用临时对象作为 数据混合包传送或者返回,为避免上述示例哪些转换接口对象的构造,你应该巧妙的避免创造这些临时对象,以防止给你的程序留下性能的阴影。

上述示例说明性能问题在于String对象,但是String在对象创建中又是如此的普遍,String是不变的,一旦赋值,就不会变化,不少程序员 认为不变的东西总是会导致坏的性能,其实它并不是这么简单,实际上,性能好坏在于你如何使用这个东西。

对于经常需要变化的String,很明显使用Stringbuffer来代替。

举例:
看下面两种实现:

public class Component {
  ...
  protected Rectangle myBounds;
  public Rectangle getBounds() { return myBounds; }

上一篇:单源点最短路径Dijkstra算法的JAVA实现 人气:2652
下一篇:Java开发为什么需要UML 人气:676
浏览全部Java的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐