Java高手经验分享 Java性能的十一个用法 - Java交流 - 三路友社论坛 娱乐交友社区论坛 - SNS
返回列表 回复 发帖

Java高手经验分享 Java性能的十一个用法

在重要的循环里,消除循环终止判断时的方法调用
                                                        private static Credit BaseCredit = new Credit();public static Credit getNewCredit() {return (Credit) BaseCredit.clone();}


Java语言习惯用语1.循环
■ 在重要的循环里,消除循环终止判断时的方法调用。
例如:将

                                                        for(int i=0; i<collection.size();i++){       ...      }

替换为…

                                                        for(int i=0; n=collection.size();i<n;i++){...}

■ 通常,把与循环index不相关的移到循环的外面

                                                        for(int i=0; terminal=x.length;i<terminal;i++){x = x/scaleA *scaleB;}

应该该成:

                                                        Double scale =  scaleB*scaleA;for(int i=0; terminal=x.length;i<terminal;i++){x = x/scale ;}

2.字符串
■ 消除字符串连接
■ 创建长字符串时,总是使用StringBuffter代替String
■ 预先分配StringBuffer空间 StringBuffer sb = new StringBuffer(5000);
3.基本数据类型
■ 在重要的循环里使用基本数据类型(int型数据通常比long/double型数据更快)
■ 基本数据类型(Boolean,Integer,etc)的包装类主要用在当传递的方法参数必须是一个对象的引用时(而不是一个基本数据类型)
■ 对所有的常量代数表达式使用static final修饰符
■ 使常量更容易引用(编译器预先计算常量表达式)
  
4.异常
■ 异常只用于单个真正的错误条件 如小说520网 www.5a520.cn 抛出异常时
抛出一个异常和执行一个catch代码块花费是很高的(主要由于当创建一个异常时要获得线程栈的一个快照)
只当条件真的异常时才抛出一个异常
■ 抛出异常首先要创建一个新的对象。
Throwable接口的构造函数调用名为fillInStackTrace()的本地(Native)方法,fillInStackTrace()方法检查堆栈,收集调用跟踪信息。
只要有异常被抛出,VM就必须调整调用堆栈,因为在处理过程中创建了一个新的对象。
异常只能用于错误处理,不应该用来控制程序流程。
■ 使编译器和运行时最优化,将几个方法调用放在一个try/catch块中,而不是为每个方法调用实现几个try/catch块

                                                                        try{            Some.method1();   //Difficut for java1.4        }catch(method1Exception e){            handle exception 1  // to optimize this code        }              try{            Some.method2();   //Difficut for java1.4         }catch(method2Exception e){            handle exception 2  // to optimize this code         }              try{             Some.method3();   //Difficut for java1.4         }catch(method3Exception e){            handle exception 3  // to optimize this code        }

应该写为:

                                                                        try{          Some.method1();             Some.method2();             Some.method3();   //Difficut for java1.4       }catch(method1Exception e){           handle exception 1         }catch(method2Exception e){           handle exception 2         }catch(method3Exception e){           handle exception 3         }

5.基准
■ 注意,所有这些技巧会因不同的平台和虚拟机而不同
  一 例如:在有些servlet容器内,通过一个OutputStream作为字节输出会更快
  二 在其它的容器内,通过一个PrintWriter输出字符会更快
■ 这些技巧描述的是最可移植的建议
■ 你可能需要运行一些基准来判断在你的平台上怎么样是最快的
6.不用new关键词创建类的实例
■用new关键词创建类的实例时,构造函数链中的所有构造函数都会被自动调用。
但如果一个对象实现了Cloneable接口,我们可以调用它的clone()方法。clone()方法不会调用任何类构造函数。
在使用设计模式(Design Pattern)的场合,如果用Factory模式创建对象,则改用clone()方法创建新的对象实例非常简单。
例如,下面是Factory模式的一个典型实现:

                                                                        public static Credit getNewCredit() {       return new Credit();      }

优化后:

                                                                        private static Credit BaseCredit = new Credit();    public static Credit getNewCredit() {    return (Credit) BaseCredit.clone();}

上面的思路对于数组处理同样很有用。
  
7.使用非阻塞I/O
■Java版本较低的JDK不支持非阻塞I/O API。为避免I/O阻塞,一些应用采用了创建大量线程的办法(在较好的情况下,会使用一个缓冲池)。这种技术可以在许多必须支持并发I/O流的应用中见到,如Web服务器、报价和拍卖应用等。然而,创建Java线程需要相当可观的开销。
JDK 1.4引入了非阻塞的I/O库(java.nio)。如果应用要求使用版本较早的JDK,在这里有一个支持非阻塞I/O的软件包。
8.不要重复初始化变量
■默认情况下,调用类的构造函数时, Java会把变量初始化成确定的值:所有的对象被设置成null,整数变量(byte、short、int、long)设置成0,float和 double变量设置成0.0,逻辑值设置成false。
当一个类从另一个类派生时,这一点尤其应该注意,因为用new关键词创建一个对象时,构造函数链中的所有构造函数都会被自动调用。
9.尽量指定类的final修饰符
■带有final修饰符的类是不可派生的。在Java核心API中,有许多应用final的例子,例如java.lang.String。为String类指定final防止了人们覆盖length()方法。
另外,如果指定一个类为final,则该类所有的方法都是final。Java编译器会寻找机会内联(inline)所有的final方法(这和具体的编译器实现有关)。此举能够使性能平均提高50%。
10.尽量使用局部变量
■调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快。其他变量,如静态变量、实例变量等,都在堆(Heap)中创建,速度较慢。另外,依赖于具体的编译器/JVM,局部变量还可能得到进一步优化。请参见《尽可能使用堆栈变量》。
11.乘法和除法
■考虑下面的代码:

                                                                                        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。值得一提的是,虽然移位操作速度快,但可能使代码比较难于理解,所以最好加上一些注释。



4.异常
■ 异常只用于单个真正的错误条件 如小说520网 www.5a520.cn 抛出异常时
抛出一个异常和执行一个catch代码块花费是很高的(主要由于当创建一个异常时要获得线程栈的一个快照)
只当条件真的异常时才抛出一个异常
■ 抛出异常首先要创建一个新的对象。
Throwable接口的构造函数调用名为fillInStackTrace()的本地(Native)方法,fillInStackTrace()方法检查堆栈,收集调用跟踪信息。
只要有异常被抛出,VM就必须调整调用堆栈,因为在处理过程中创建了一个新的对象。
异常只能用于错误处理,不应该用来控制程序流程。
■ 使编译器和运行时最优化,将几个方法调用放在一个try/catch块中,而不是为每个方法调用实现几个try/catch块

                                                        try{            Some.method1();   //Difficut for java1.4        }catch(method1Exception e){            handle exception 1  // to optimize this code        }              try{            Some.method2();   //Difficut for java1.4         }catch(method2Exception e){            handle exception 2  // to optimize this code         }              try{             Some.method3();   //Difficut for java1.4         }catch(method3Exception e){            handle exception 3  // to optimize this code        }

应该写为:

                                                        try{          Some.method1();             Some.method2();             Some.method3();   //Difficut for java1.4       }catch(method1Exception e){           handle exception 1         }catch(method2Exception e){           handle exception 2         }catch(method3Exception e){           handle exception 3         }

5.基准
■ 注意,所有这些技巧会因不同的平台和虚拟机而不同
  一 例如:在有些servlet容器内,通过一个OutputStream作为字节输出会更快
  二 在其它的容器内,通过一个PrintWriter输出字符会更快
■ 这些技巧描述的是最可移植的建议
■ 你可能需要运行一些基准来判断在你的平台上怎么样是最快的
6.不用new关键词创建类的实例
■用new关键词创建类的实例时,构造函数链中的所有构造函数都会被自动调用。
但如果一个对象实现了Cloneable接口,我们可以调用它的clone()方法。clone()方法不会调用任何类构造函数。
在使用设计模式(Design Pattern)的场合,如果用Factory模式创建对象,则改用clone()方法创建新的对象实例非常简单。
例如,下面是Factory模式的一个典型实现:

                                                        public static Credit getNewCredit() {       return new Credit();      }

优化后:

                                                        private static Credit BaseCredit = new Credit();    public static Credit getNewCredit() {    return (Credit) BaseCredit.clone();}

上面的思路对于数组处理同样很有用。
  
7.使用非阻塞I/O
■Java版本较低的JDK不支持非阻塞I/O API。为避免I/O阻塞,一些应用采用了创建大量线程的办法(在较好的情况下,会使用一个缓冲池)。这种技术可以在许多必须支持并发I/O流的应用中见到,如Web服务器、报价和拍卖应用等。然而,创建Java线程需要相当可观的开销。
JDK 1.4引入了非阻塞的I/O库(java.nio)。如果应用要求使用版本较早的JDK,在这里有一个支持非阻塞I/O的软件包。
8.不要重复初始化变量
■默认情况下,调用类的构造函数时, Java会把变量初始化成确定的值:所有的对象被设置成null,整数变量(byte、short、int、long)设置成0,float和 double变量设置成0.0,逻辑值设置成false。
当一个类从另一个类派生时,这一点尤其应该注意,因为用new关键词创建一个对象时,构造函数链中的所有构造函数都会被自动调用。
9.尽量指定类的final修饰符
■带有final修饰符的类是不可派生的。在Java核心API中,有许多应用final的例子,例如java.lang.String。为String类指定final防止了人们覆盖length()方法。
另外,如果指定一个类为final,则该类所有的方法都是final。Java编译器会寻找机会内联(inline)所有的final方法(这和具体的编译器实现有关)。此举能够使性能平均提高50%。
10.尽量使用局部变量
■调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快。其他变量,如静态变量、实例变量等,都在堆(Heap)中创建,速度较慢。另外,依赖于具体的编译器/JVM,局部变量还可能得到进一步优化。请参见《尽可能使用堆栈变量》。
11.乘法和除法
■考虑下面的代码:

                                                                        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。值得一提的是,虽然移位操作速度快,但可能使代码比较难于理解,所以最好加上一些注释。
遇到好贴我是必顶的!















www.feng001.cn
最新传奇制作 连击复古qq1370200433
怎么开传奇SF私服赚钱传奇私服制作传奇私服业务这是一个与众不同的品牌.
那就是用专业的人做专业的事
对客户负责的工作态度  
策略引领设计
做有思想的设计  
站在多角度做设计
跳出设计做设计
24小时技术QQ1370200433 客服QQ1370200433
24小时技术QQ1370200433 客服QQ1370200433
24小时技术QQ1370200433 客服QQ1370200433

诚心需要者请联系客服洽谈相关业务!
请按照以上的联系方式同客户取得最便捷的联系!
各种网游私服专业一条龙托管让您轻松做GM
金牌VIP导购QQ:1370200433
QQ:1370200433 点击这里给我发消息
E世博www.3loo.com/link.php?url=http://www.bc678.info/ ESBALLE世博.ESBALL学到的东西读蒂娜Fey的''Bossypants''

读蒂娜Fey的''Bossypants''配备了可预见的后果,你会笑出声来(可能运行的看起来很愚蠢,而在公众阅读风险),但它也来自一个意想不到的副作用 - 你学到一些有趣的东西。而且不管是傻,但为什么你不应该与Amy艾米波哈尔一塌糊涂,亚历克鲍德温被大致相当于急功近利,以及为什么你应该很高兴在邮轮上演出。读五样东西,我们在这里学到>>

1)E世博.ESBALL不喜欢它时,你完成他的句子:
“唯一有意见的人提供了有关会议和洛恩我是''不管你做什么,没有完成他的句子。''芝加哥的女演员我知道显然会犯下这个错误,她相信她的工作它的成本。当我走进他的办公室终于迎来了,我坐了下来,坚决不将其炸毁。洛恩说,''那你是从... ''

e世博 www.2688pk.com/bocairibo/Eshibo

Esball www.3loo.com/link.php?url=http://urlrank.info/open-esball.html
188bet www.3loo.com/link.php?url=http://urlrank.info/open-188bet.html
dafabet www.3loo.com/link.php?url=http://urlrank.info/open-dafabetl.html

bodog www.3loo.com/link.php?url=http://urlrank.info/open-bodog.html
pk989 www.3loo.com/link.php?url=http://urlrank.info/open-pk989.html
e世博www.2688pk.com/bocairibo/Eshibo

百胜滩 178game 伟易博 伟博娱乐 博九娱乐城 永胜博 K7娱乐城 开心8 智尊国际 乐博娱乐城 尊爵娱乐城 88娱乐城 多彩娱乐城 圣淘沙亚洲 马牌娱乐城 菲彩国际 菲E乐博 大赢家娱乐城 银河国际 牌九娱乐场 立即博 瑞丰国际 博客国际 爱赢娱乐 乐百家 三易博 博亿娱乐城 欧华娱乐立博 久盛国际 肯博 博狗娱乐 八大胜 易发国际 日博BET365 博士娱乐优博娱乐 爱拼娱乐城 太阳城亚洲 金宝博 12博 E世博 TT娱乐城 333娱乐 明升 乐天堂 E路发 鸿博 新利 利高娱乐城 奇乐吧,伟德 888真人 易胜博 其它娱乐 大发娱乐场 狮威娱乐 战神娱乐
它似乎永远挂在那里。他为什么没有完成的问题?如果我现在回答,我会说这算是对他?我不记得如何正常人讲话模式工作。另一个五秒钟过去了,仍然没有从洛恩一句。哦,上帝。当我飞回芝加哥的第二天,他们会说,''怎么你和洛恩迈克尔斯会议?''而我会回答说:''他说''那你是从'',然后我们坐在那里一个小时,然后一个女孩走进来问我离开。“

2)艾米艾米波哈尔不安泰不管你认为她的粗鲁[寻呼]:

“艾米是在一些中等... ...和她废话一个玩笑庸俗的东西。我不记得确切是什么,除了它是肮脏的,大声和''unladylike。''

吉米法伦,谁是可以说是当时的表演明星,转身向她,并在人造娇气的声音说:''住手!这不是很可爱!我不喜欢它。''

www.2688pk.com   明升88
88娱乐城
www.2688pk.com 奇乐吧 www.2688pk.com  e世博 www.2688pk.com 瑞丰国际www.2688pk.com/bocairibo/yazhouyulechang 战神娱乐www.2688pk.com/bocairibo/yazhouyulechang
艾米下降她在做什么,黑色的眼睛去了他第二次和轮式左右。 ''我不f **王不在乎你是否喜欢它。''吉米显然被吓了一跳。艾米去了右后卫在享受她的荒谬位。 (我应该说清楚,吉米和艾米是非常好的朋友,有他们之间从来没有任何真正的牛肉。阴茎插入笑话在这里。)“

3)如果您的E世博.ESBALL正在下降,舞者和音乐家在你的生活费用。我们说明确“负责”而不是“负责”,因为好:

“在紧急情况下,它是在表演谁掌管救生艇。由于其他工作人员有实际海里的职责,从嘉年华卡连孩子们进行培训,以人的救生艇。如果你要获取有关救生艇,在你的安全负责人将可能是刚刚从坦帕谁与他有关新蕾哈娜男友打架视频十九岁的舞蹈演员。詹姆斯还告诉我,每艘救生艇上有一把枪,而且一次救生艇在水中,表演,训练,救生艇队长是谁开枪的人是破坏性的。这显然是与海事法规定的法律。“

4)专业拍照需要时间来准备的头脑麻木金额:

“只要两,三个小时后,您的到来,你准备好将要采取的摄影师和拍摄。”

5)成功的秘诀就万无一失了亚历克鲍德温包括堆积部分:

E世博.ESBALL负责人都看过我的古怪和独特的飞行员(亚历克鲍德温)有价值的东西,因为某些原因,他们决定(亚历克鲍德温)为''把它捡起来。''这意味着他们同意向十一个插曲,也许他们在电视上展示。
返回列表