选择显示字体大小

java性能优化技巧集锦

摘要:

  可供程序利用的资源(内存、cpu时间、网络带宽等)是有限的,优化的目的就是让程序用尽可能少的资源完成预定的任务。优化通常包含两方面的内容:减小代码的体积,提高代码的运行效率。本文讨论的主要是如何提高代码的效率。

  一、通用篇

  “通用篇”讨论的问题适合于大多数java应用。

  1.1 不用new关键词创建类的实例

  用new关键词创建类的实例时,构造函数链中的所有构造函数都会被自动调用。但如果一个对象实现了cloneable接口,我们可以调用它的clone()方法。clone()方法不会调用任何类构造函数。

  在使用设计模式(design pattern)的场合,如果用factory模式创建对象,则改用clone()方法创建新的对象实例非常简单。例如,下面是factory模式的一个典型实现:

public static credit getnewcredit()
{
 return new credit();
}

  改进后的代码使用clone()方法,如下所示:

private static credit basecredit = new credit();
public static credit getnewcredit()
{
 return (credit) basecredit.clone();
}

  上面的思路对于数组处理同样很有用。

  1.2 使用非阻塞i/o

  版本较低的jdk不支持非阻塞i/o api。为避免i/o阻塞,一些应用采用了创建大量线程的办法(在较好的情况下,会使用一个缓冲池)。这种技术可以在许多必须支持并发i/o流的应用中见到,如web服务器、报价和拍卖应用等。然而,创建java线程需要相当可观的开销。

  jdk 1.4引入了非阻塞的i/o库(java.nio)。如果应用要求使用版本较早的jdk,在这里有一个支持非阻塞i/o的软件包。

  1.3 慎用异常

  异常对性能不利。抛出异常首先要创建一个新的对象。throwable接口的构造函数调用名为fillinstacktrace()的本地(native)方法,fillinstacktrace()方法检查堆栈,收集调用跟踪信息。只要有异常被抛出,vm就必须调整调用堆栈,因为在处理过程中创建了一个新的对象。

  异常只能用于错误处理,不应该用来控制程序流程。

  1.4 不要重复初始化变量

  默认情况下,调用类的构造函数时, java会把变量初始化成确定的值:所有的对象被设置成null,整数变量(byte、short、int、long)设置成0,float和double变量设置成0.0,逻辑值设置成false。当一个类从另一个类派生时,这一点尤其应该注意,因为用new关键词创建一个对象时,构造函数链中的所有构造函数都会被自动调用。

  1.5 尽量指定类的final修饰符

  带有final修饰符的类是不可派生的。在java核心api中,有许多应用final的例子,例如java.lang.string。为string类指定final防止了人们覆盖length()方法。

  另外,如果指定一个类为final,则该类所有的方法都是final。java编译器会寻找机会内联(inline)所有的final方法(这和具体的编译器实现有关)。此举能够使性能平均提高50%。

  1.6 尽量使用局部变量

  调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(stack)中,速度较快。其他变量,如静态变量、实例变量等,都在堆(heap)中创建,速度较慢。另外,依赖于具体的编译器/jvm,局部变量还可能得到进一步优化。请参见《尽可能使用堆栈变量》。

  1.7 乘法和除法

  考虑下面的代码:

for (val = 0; val < 100000; val +=5)
{
 alterx = val * 8;
 myresult = val * 2;
}

  用移位操作替代乘法操作可以极大地提高性能。下面是修改后的代码:

for (val = 0; val < 100000; val += 5)
{
 alterx = val << 3;
 myresult = val << 1;
}

  修改后的代码不再做乘以8的操作,而是改用等价的左移3位操作,每左移1位相当于乘以2。相应地,右移1位操作相当于除以2。值得一提的是,虽然移位操作速度快,但可能使代码比较难于理解,所以最好加上一些注释。


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons