JAVA编程:Java功能的优化(下)(转)
如果你学习的是市场营销,是销售,也许参加大课堂的学习会更合适,因为你的工作能力中有个基础就是搭建自己的人脉,功能|优化三.优化JAVA程序计划和编码,进步JAVA程序功能的一些办法。经由过程利用一些后面先容过的帮助性工具来找到程序中的瓶颈,然后就能够对瓶颈部分的代码举行优化。一样平常有两种计划:即优化代码或变动计划办法。我们一样平常会选择后者,由于不往挪用以下代码要比挪用一些优化的代码更能进步程序的功能。而一个计划优秀的程序可以精简代码,从而进步功能。
上面将供应一些在JAVA程序的计划和编码中,为了可以进步JAVA程序的功能,而常常接纳的一些办法和技能。
1.对象的天生和巨细的调剂。
JAVA程序计划中一个广泛的成绩就是没有好好的使用JAVA言语自己供应的函数,从而经常会天生大批的对象(或实例)。因为体系不但要花工夫天生对象,今后大概还需花工夫对这些对象举行渣滓接纳和处置。因而,天生过量的对象将会给程序的功能带来很年夜的影响。
例1:关于String,StringBuffer,+和append
JAVA言语供应了关于String范例变量的操纵。但假如利用不妥,会给程序的功能带来影响。以下面的语句:
Stringname=newString(“HuangWeiFeng”);
System.out.println(name+”ismyname”);
看似已很精简了,实在并不是云云。为了天生二进制的代码,要举行以下的步骤和操纵。
(1)天生新的字符串newString(STR_1);
(2)复制该字符串。
(3)加载字符串常量”HuangWeiFeng”(STR_2);
(4)挪用字符串的构架器(Constructor);
(5)保留该字符串到数组中(从地位0入手下手)
(6)从java.io.PrintStream类中失掉静态的out变量
(7)天生新的字符串缓冲变量newStringBuffer(STR_BUF_1);
(8)复制该字符串缓冲变量
(9)挪用字符串缓冲的构架器(Constructor);
(10)保留该字符串缓冲到数组中(从地位1入手下手)
(11)以STR_1为参数,挪用字符串缓冲(StringBuffer)类中的append办法。
(12)加载字符串常量”ismyname”(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五个对象变量。这些天生的类的实例一样平常都寄存在堆中。堆要对一切类的超类,类的实例举行初始化,同时还要挪用类极为每一个超类的构架器。而这些操纵都长短常损耗体系资本的。因而,对对象的天生举行限定,是完整有需要的。
经修正,下面的代码能够用以下的代码来交换。
StringBuffername=newStringBuffer(“HuangWeiFeng”);
System.out.println(name.append(“ismyname.”).toString());
体系将举行以下的操纵。
(1)天生新的字符串缓冲变量newStringBuffer(STR_BUF_1);
(2)复制该字符串缓冲变量
(3)加载字符串常量”HuangWeiFeng”(STR_1);
(4)挪用字符串缓冲的构架器(Constructor);
(5)保留该字符串缓冲到数组中(从地位1入手下手)
(6)从java.io.PrintStream类中失掉静态的out变量
(7)加载STR_BUF_1;
(8)加载字符串常量”ismyname”(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:
Stringname=newStringBuffer(“HuangWeiFeng”);
name+=”ismy”;
name+=”name”;
代码段2:
StringBuffername=newStringBuffer(“HuangWeiFeng”);
name.append(“ismy”);
name.append(“name.”).toString();
因而,充实的使用JAVA供应的库函数来优化程序,对进步JAVA程序的功能时十分主要的.其注重点次要有以下几方面;
(1)尽量的利用静态变量(StaticClassVariables)
假如类中的变量不会随他的实例而变更,就能够界说为静态变量,从而使他一切的实例都共享这个变量。
例:
publicclassfoo
{
SomeObjectso=newSomeObject();
}
就能够界说为:
publicclassfoo
{
staticSomeObjectso=newSomeObject();
}
(2)不要对已天生的对象作过量的改动。
关于一些类(如:String类)来说,宁肯在从头天生一个新的对象实例,而不该该修正已天生的对象实例。
例:
Stringname=”Huang”;
name=”Wei”;
name=”Feng”;
上述代码天生了三个String范例的对象实例。而前两个即刻就必要体系举行渣滓接纳处置。假如要对字符串举行毗连的操纵,功能将得更差。由于体系将不得为今生成更多得一时变量。如上例1所示。
(3)天生对象时,要分派给它公道的空间和巨细
JAVA中的良多类都有它的默许的空间分派巨细。关于StringBuffer类来说,默许的分派空间巨细是16个字符。假如在程序中利用StringBuffer的空间巨细不是16个字符,那末就必需举行准确的初始化。
(4)制止天生不太利用或性命周期短的对象或变量。
关于这类情形,因该界说一个对象缓冲池。觉得办理一个对象缓冲池的开支要比频仍的天生和接纳对象的开支小的多。
(5)只在对象感化局限内举行初始化。
JAVA同意在代码的任何中央界说和初始化对象。如许,就能够只在对象感化的局限内举行初始化。从而勤俭体系的开支。
例:
SomeObjectso=newSomeObject();
If(x==1)then
{
Foo=so.getXX();
}
能够修正为:
if(x==1)then
{
SomeObjectso=newSomeObject();
Foo=so.getXX();
}
2.非常(Exceptions)
JAVA言语中供应了try/catch来发便利用户捕获非常,举行非常的处置。可是假如利用不妥,也会给JAVA程序的功能带来影响。因而,要注重以下两点。
(1)制止对使用程序的逻辑利用try/catch
假如能够用if,while等逻辑语句来处置,那末就尽量的不必try/catch语句
(2)重用非常
在必需要举行非常的处置时,要尽量的重用已存在的非常对象。觉得在非常的处置中,天生一个非常对象要损耗失落年夜部分的工夫。
3.线程(Threading)
一个高功能的使用程序中一样平常城市用到线程。由于线程能充实使用体系的资本。在其他线程由于守候硬盘或收集读写而时,程序能持续处置和运转。可是对线程使用不妥,也会影响程序的功能。
例2:准确利用Vector类
Vector次要用来保留各类范例的对象(包含不异范例和分歧范例的对象)。可是在一些情形下利用会给程序带来功能上的影响。这次要是由Vector类的两个特性所决意的。第一,Vector供应了线程的平安回护功效。即便Vector类中的很多办法同步。可是假如你已确认你的使用程序是单线程,这些办法的同步就完整不用要了。第二,在Vector查找存储的各类对象时,经常要花良多的工夫举行范例的婚配。而当这些对象都是统一范例时,这些婚配就完整不用要了。因而,有需要计划一个单线程的,保留特定范例对象的类或汇合来替换Vector类.用来交换的程序以下(StringVector.java):
publicclassStringVector
{
privateString[]data;
privateintcount;
publicStringVector(){this(10);//defaultsizeis10}
publicStringVector(intinitialSize)
{
data=newString;
}
publicvoidadd(Stringstr)
{
//ignorenullstrings
if(str==null){return;}
ensureCapacity(count+1);
data=str;
}
privatevoidensureCapacity(intminCapacity)
{
intoldCapacity=data.length;
if(minCapacity>oldCapacity)
{
StringoldData[]=data;
intnewCapacity=oldCapacity*2;
data=newString;
System.arraycopy(oldData,0,data,0,count);
}
}
publicvoidremove(Stringstr)
{
if(str==null){return//ignorenullstr}
for(inti=0;i<count;i++)
{
//checkforamatch
if(data.equals(str))
{
System.arraycopy(data,i+1,data,i,count-1);//copydata
//allowpreviouslyvalidarrayelementbegcd
data[--count]=null;
return;
}
}
}
publicfinalStringgetStringAt(intindex){
if(index<0){returnnull;}
elseif(index>count)
{
returnnull;//indexis>#strings
}
else{returndata;//indexisgood}
}
/****************StringVector.java*****************/
因而,代码:
VectorStrings=newVector();
Strings.add(“One”);
Strings.add(“Two”);
StringSecond=(String)Strings.elementAt(1);
能够用以下的代码交换:
StringVectorStrings=newStringVector();
Strings.add(“One”);
Strings.add(“Two”);
StringSecond=Strings.getStringAt(1);
如许就能够经由过程优化线程来进步JAVA程序的功能。用于测试的程序以下(TestCollection.java):
importjava.util.Vector;
publicclassTestCollection
{
publicstaticvoidmain(Stringargs[])
{
TestCollectioncollect=newTestCollection();
if(args.length==0)
{
System.out.println(
"Usage:javaTestCollection");
System.exit(1);
}
if(args.equals("vector"))
{
Vectorstore=newVector();
longstart=System.currentTimeMillis();
for(inti=0;i<1000000;i++)
{
store.addElement("string");
}
longfinish=System.currentTimeMillis();
System.out.println((finish-start));
start=System.currentTimeMillis();
for(inti=0;i<1000000;i++)
{
Stringresult=(String)store.elementAt(i);
}
finish=System.currentTimeMillis();
System.out.println((finish-start));
}
elseif(args.equals("stringvector"))
{
StringVectorstore=newStringVector();
longstart=System.currentTimeMillis();
for(inti=0;i<1000000;i++){store.add("string");}
longfinish=System.currentTimeMillis();
System.out.println((finish-start));
start=System.currentTimeMillis();
for(inti=0;i<1000000;i++){
Stringresult=store.getStringAt(i);
}
finish=System.currentTimeMillis();
System.out.println((finish-start));
}
}
}
/****************TestCollection.java*****************/
测试的了局以下(假定尺度的工夫为1,越小功能越好):
关于线程的操纵,要注重以下几个方面。
(1)避免过量的同步
如上所示,不用要的同步经常会形成程序功能的下落。因而,假如程序是单线程,则必定不要利用同步。
(2)同步办法而不要同步全部代码段
对某个办法或函数举行同步比对全部代码段举行同步的功能要好。
(3)对每一个对象利用多”锁”的机制来增年夜并发。
一样平常每一个对象都只要一个”锁”,这就标明假如两个线程实行一个对象的两个分歧的同步办法时,会产生”逝世锁”。即便这两个办法其实不共享任何资本。为了不这个成绩,能够对一个对象实施”多锁”的机制。以下所示:
classfoo
{
privatestaticintvar1;
privatestaticObjectlock1=newObject();
privatestaticintvar2;
privatestaticObjectlock2=newObject();
publicstaticvoidincrement1()
{
synchronized(lock1)
{
var1++;
}
}
publicstaticvoidincrement2()
{
synchronized(lock2)
{
var2++;
}
}
}
4.输出和输入(I/O)
输出和输入包含良多方面,但触及最多的是对硬盘,收集或数据库的读写操纵。关于读写操纵,又分为有缓存和没有缓存的;关于数据库的操纵,又能够有多品种型的JDBC驱动器能够选择。但不管如何,城市给程序的功能带来影响。因而,必要注重以下几点:
(1)利用输出输入缓冲
尽量的多利用缓存。但假如要常常对缓存举行革新(flush),则倡议不要利用缓存。
(2)输入流(OutputStream)和Unicode字符串
事先用OutputStream和Unicode字符串时,Write类的开支对照年夜。由于它要完成Unicode到字节(byte)的转换.因而,假如大概的话,在利用Write类之前就完成转换或用OutputStream类取代Writer类来利用。
(3)当需序列化时利用transient
当序列化一个类或对象时,关于那些原子范例(atomic)或能够重修的原素要表识为transient范例。如许就不必每次都举行序列化。假如这些序列化的对象要在收集上传输,这一小小的改动对功能会有很年夜的进步。
(4)利用高速缓存(Cache)
关于那些常常要利用而又不年夜变更的对象或数据,能够把它存储在高速缓存中。如许就能够进步会见的速率。这一点关于从数据库中前往的了局集特别主要。
(5)利用速率快的JDBC驱动器(Driver)
JAVA对会见数据库供应了四种办法。这个中有两种是JDBC驱动器。一种是用JAVA外包的当地驱动器;另外一种是完整的JAVA驱动器。详细要利用哪种得依据JAVA布署的情况和使用程序自己来定。
5.一些其他的履历和技能
(1)利用部分变量
(2)制止在统一个类中动过挪用函数或办法(get或set)来设置或挪用变量。
(3)制止在轮回中天生统一个变量或挪用统一个函数(参数变量也一样)
(4)尽量的利用static,final,private等关头字
(5)当复制大批数据时,利用System.arraycopy()命令。
为什么外国人还要写那些框架进行代码封装,他们不就是为了别人使用时可以更简单么!如果要达到一个企业级项目的不用框架是很难的。小一些的项目还行,大的光是MVC模式的设计的编码量就够大的了。还有性能方面,单轮windows,这个工具是微软写的,。 如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。 不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。 是一种将安全性(Security)列为第一优先考虑的语言 Java 编程语言的风格十分接近C、C++语言。 Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站 Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站 关于设计模式的资料,还是向大家推荐banq的网站 http://www.jdon.com/,他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。 如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。 你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。 学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。 其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。 至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。 不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。 Java 编程语言的风格十分接近C、C++语言。 另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。 不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。 http://www.jdon.com/去下载,或到同济技术论坛的服务器ftp://nro.shtdu.edu.cn去下,安装上有什么问题,可以到论坛上去提问。 Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台
页:
[1]