11种提高Java性能的写法

来源:互联网 发布:广州游戏编程培训 编辑:程序博客网 时间:2024/05/22 06:04

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[i] = x[i]/scaleA *scaleB;
}
应该该成:

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

2.字符串 

■ 消除字符串连接
■ 创建长字符串时,总是使用StringBuffter代替String
■ 预先分配StringBuffer空间 StringBuffer sb = new StringBuffer(5000);

3.基本数据类型 

■ 在重要的循环里使用基本数据类型(int型数据通常比long/double型数据更快)
■ 基本数据类型(Boolean,Integer,etc)的包装类主要用在当传递的方法参数必须是一个对象的引用时(而不是一个基本数据类型)
■ 对所有的常量代数表达式使用static final修饰符
■ 使常量更容易引用(编译器预先计算常量表达式)


4.异常 
■ 异常只用于单个真正的错误条件
抛出一个异常和执行一个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。值得一提的是,虽然移位操作速度快,但可能使代码比较难于理解,所以最好加上一些注释。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 一个人心理产生极度恐慌失眠怎么办 肺被子弹打穿了怎么办 文明5完整版锁区怎么办 2017文明5锁区怎么办 软件安装了错误补丁打不开怎么办 小米sd卡不可用怎么办 电视用遥控器关上打不开了怎么办 求生之路2控制台打不开怎么办 比亚迪一键启动没反应怎么办 电动车车头锁开不了怎么办 锁里面卡了东西怎么办 电脑显示器闪屏然后黑屏怎么办 枪火游侠闪退怎么办 欧卡2气压过低怎么办 微信安装包己损坏怎么办 qq超市金币累计满了怎么办 我该怎么办?欠了那么多钱? 枪神王座被检测怎么办 酷派大神x7刷机出1004怎么办 水鬼捞锤塌方了怎么办 请事假领导不批怎么办 要请假领导不批怎么办 有急事请假不批怎么办 员工要请假不批怎么办 普法知识竞赛要重新参与怎么办 我被当兵的打怎么办 头发没了一小块怎么办 改革怎么看我该怎么办 笔记本电脑卡死了怎么办关不了机 电脑卡死了怎么办关不了机 火车上别人占座怎么办 火车上遇到占座怎么办 青少年体力差容易疲劳怎么办 四年级的孩子作业拖拉怎么办 四年级孩子不写作业怎么办 四年级孩子不爱写作业怎么办 四年级的孩子写作业慢怎么办 四年级孩子不想写作业怎么办 四年级孩子写作业特别慢怎么办 6岁儿童睡眠少怎么办 四岁儿童睡眠少怎么办