选择显示字体大小

java性能优化-之一

1.对象的生成和大小的调整。
java程序设计中一个普遍的问题就是没有好好的利用java语言本身提供的函数,从而常常会生成大量的对象(或实例)。由于系统不仅要花时间生成对象,以后可能还需花时间对这些对象进行垃圾回收和处理。因此,生成过多的对象将会给程序的性能带来很大的影响。

例1:关于string ,stringbuffer,+和append
java语言提供了对于string类型变量的操作。但如果使用不当,会给程序的性能带来影响。如下面的语句:
string name=new string(“huangweifeng”);
system.out.println(name+”is my name”);
看似已经很精简了,其实并非如此。为了生成二进制的代码,要进行如下的步骤和操作。
(1) 生成新的字符串 new string(str_1);
(2) 复制该字符串。
(3) 加载字符串常量”huangweifeng”(str_2);
(4) 调用字符串的构架器(constructor);
(5) 保存该字符串到数组中(从位置0开始)
(6) 从java.io.printstream类中得到静态的out变量
(7) 生成新的字符串缓冲变量new stringbuffer(str_buf_1);
(8) 复制该字符串缓冲变量
(9) 调用字符串缓冲的构架器(constructor);
(10) 保存该字符串缓冲到数组中(从位置1开始)
(11) 以str_1为参数,调用字符串缓冲(stringbuffer)类中的append方法。
(12) 加载字符串常量”is my name”(str_3);
(13) 以str_3为参数,调用字符串缓冲(stringbuffer)类中的append方法。
(14) 对于str_buf_1执行tostring命令。
(15) 调用out变量中的println方法,输出结果。

由此可以看出,这两行简单的代码,就生成了str_1,str_2,str_3,str_4和str_buf_1五个对象变量。这些生成的类的实例一般都存放在堆中。堆要对所有类的超类,类的实例进行初始化,同时还要调用类极其每个超类的构架器。而这些操作都是非常消耗系统资源的。因此,对对象的生成进行限制,是完全有必要的。
经修改,上面的代码可以用如下的代码来替换。

stringbuffer name=new stringbuffer(“huangweifeng”); 
system.out.println(name.append(“is my name.”).tostring());

系统将进行如下的操作。
(1) 生成新的字符串缓冲变量new stringbuffer(str_buf_1);
(2) 复制该字符串缓冲变量
(3) 加载字符串常量”huangweifeng”(str_1);
(4) 调用字符串缓冲的构架器(constructor);
(5) 保存该字符串缓冲到数组中(从位置1开始)
(6) 从java.io.printstream类中得到静态的out变量
(7) 加载str_buf_1;
(8) 加载字符串常量”is my name”(str_2);
(9) 以str_2为参数,调用字符串缓冲(stringbuffer)实例中的append方法。
(10) 对于str_buf_1执行tostring命令。(str_3)
(11)调用out变量中的println方法,输出结果。
由此可以看出,经过改进后的代码只生成了四个对象变量:str_1,str_2,str_3和str_buf_1.你可能觉得少生成一个对象不会对程序的性能有很大的提高。但下面的代码段2的执行速度将是代码段1的2倍。因为代码段1生成了八个对象,而代码段2只生成了四个对象。
代码段1:
string name= new stringbuffer(“huangweifeng”); 
name+=”is my”;
name+=”name”;

代码段2:
stringbuffer name=new stringbuffer(“huangweifeng”); 
name.append(“is my”);
name.append(“name.”).tostring();

因此,充分的利用java提供的库函数来优化程序,对提高java程序的性能时非常重要的.其注意点主要有如下几方面;
(1) 尽可能的使用静态变量(static class variables)
如果类中的变量不会随他的实例而变化,就可以定义为静态变量,从而使他所有的实例都共享这个变量。
例:
public class foo 
{
someobject so=new someobject();
}

就可以定义为:
public class foo 
{
static someobject so=new someobject();
}  

(2) 不要对已生成的对象作过多的改变。
对于一些类(如:string类)来讲,宁愿在重新生成一个新的对象实例,而不应该修改已经生成的对象实例。
例:
string name=”huang”;
name=”wei”;
name=”feng”;
上述代码生成了三个string类型的对象实例。而前两个马上就需要系统进行垃圾回收处理。如果要对字符串进行连接的操作,性能将得更差。因为系统将不得为此生成更多得临时变量。如上例1所示。  
(3) 生成对象时,要分配给它合理的空间和大小
java中的很多类都有它的默认的空间分配大小。对于stringbuffer类来讲,默认的分配空间大小是16个字符。如果在程序中使用stringbuffer的空间大小不是16个字符,那么就必须进行正确的初始化。
(4) 避免生成不太使用或生命周期短的对象或变量。
对于这种情况,因该定义一个对象缓冲池。以为管理一个对象缓冲池的开销要比频繁的生成和回收对象的开销小的多。
(5) 只在对象作用范围内进行初始化。
java允许在代码的任何地方定义和初始化对象。这样,就可以只在对象作用的范围内进行初始化。从而节约系统的开销。
例:
someobject so=new someobject(); 
if(x==1) then
{
foo=so.getxx();
}
可以修改为:
if(x==1) then
{
someobject so=new someobject();
foo=so.getxx();
}
from-:http://www.computerworld.com.cn


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

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