`
thurchin
  • 浏览: 9623 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

Java程序性能优化

    博客分类:
  • Java
阅读更多

Java程序性能优化

关键字: java 性能

一、避免在循环条件中使用复杂表达式


在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快。

例子:

Java代码

  1. import java.util.Vector;   
  2. class CEL {   
  3.     void method (Vector vector) {   
  4.         for (int i = 0; i < vector.size (); i++)  // Violation   
  5.             ; // ...   
  6.     }   
  7. }  

import java.util.Vector;

class CEL {

    void method (Vector vector) {

        for (int i = 0; i < vector.size (); i++)  // Violation

            ; // ...

    }

}

 



更正:

Java代码

  1. class CEL_fixed {   
  2.     void method (Vector vector) {   
  3.         int size = vector.size ()   
  4.         for (int i = 0; i < size; i++)   
  5.             ; // ...   
  6.     }   
  7. }  

class CEL_fixed {

    void method (Vector vector) {

        int size = vector.size ()

        for (int i = 0; i < size; i++)

            ; // ...

    }

}

 

 

二、为'Vectors' 'Hashtables'定义初始大小


JVM
Vector扩充大小的时候需要重新创建一个更大的数组,将原原先数组中的内容复制过来,最后,原先的数组再被回收。可见Vector容量的扩大是一个颇费时间的事。
通常,默认的10个元素大小是不够的。你最好能准确的估计你所需要的最佳大小。

例子:

Java代码

  1. import java.util.Vector;   
  2. public class DIC {   
  3.     public void addObjects (Object[] o) {   
  4.         // if length > 10, Vector needs to expand   
  5.         for (int i = 0; i< o.length;i++) {       
  6.             v.add(o);   // capacity before it can add more elements.   
  7.         }   
  8.     }   
  9.     public Vector v = new Vector();  // no initialCapacity.   
  10. }  

import java.util.Vector;

public class DIC {

    public void addObjects (Object[] o) {

        // if length > 10, Vector needs to expand

        for (int i = 0; i< o.length;i++) {   

            v.add(o);   // capacity before it can add more elements.

        }

    }

    public Vector v = new Vector();  // no initialCapacity.

}

 



更正:
自己设定初始大小。

Java代码

  1. public Vector v = new Vector(20);     
  2.    public Hashtable hash = new Hashtable(10);   

 public Vector v = new Vector(20); 

    public Hashtable hash = new Hashtable(10);

 


参考资料:
Dov Bulka, "Java Performance and Scalability Volume 1: Server-Side Programming
Techniques" Addison Wesley, ISBN: 0-201-70429-3 pp.55 – 57

三、在finally块中关闭Stream


程序中使用到的资源应当被释放,以避免资源泄漏。这最好在finally块中去做。不管程序执行的结果如何,finally块总是会执行的,以确保资源的正确关闭。
         
例子:

Java代码

  1. import java.io.*;   
  2. public class CS {   
  3.     public static void main (String args[]) {   
  4.         CS cs = new CS ();   
  5.         cs.method ();   
  6.     }   
  7.     public void method () {   
  8.         try {   
  9.             FileInputStream fis = new FileInputStream ("CS.java");   
  10.             int count = 0;   
  11.             while (fis.read () != -1)   
  12.                 count++;   
  13.             System.out.println (count);   
  14.             fis.close ();   
  15.         } catch (FileNotFoundException e1) {   
  16.         } catch (IOException e2) {   
  17.         }   
  18.     }   
  19. }  

import java.io.*;

public class CS {

    public static void main (String args[]) {

        CS cs = new CS ();

        cs.method ();

    }

    public void method () {

        try {

            FileInputStream fis = new FileInputStream ("CS.java");

            int count = 0;

            while (fis.read () != -1)

                count++;

            System.out.println (count);

            fis.close ();

        } catch (FileNotFoundException e1) {

        } catch (IOException e2) {

        }

    }

}

 


         
更正:
在最后一个catch后添加一个finally

参考资料:
Peter Haggar: "Practical Java - Programming Language Guide".
Addison Wesley, 2000, pp.77-79

四、使用'System.arraycopy ()'代替通过来循环复制数组


'System.arraycopy ()'
要比通过循环来复制数组快的多。
         
例子:

Java代码

  1. public class IRB   
  2. {   
  3.     void method () {   
  4.         int[] array1 = new int [100];   
  5.         for (int i = 0; i < array1.length; i++) {   
  6.             array1 [i] = i;   
  7.         }   
  8.         int[] array2 = new int [100];   
  9.         for (int i = 0; i < array2.length; i++) {   
  10.             array2 [i] = array1 [i];                 // Violation   
  11.         }   
  12.     }   
  13. }  

public class IRB

{

    void method () {

        int[] array1 = new int [100];

        for (int i = 0; i < array1.length; i++) {

            array1 [i] = i;

        }

        int[] array2 = new int [100];

        for (int i = 0; i < array2.length; i++) {

            array2 [i] = array1 [i];                 // Violation

        }

    }

}

 


         
更正:

Java代码

  1. public class IRB   
  2. {   
  3.     void method () {   
  4.         int[] array1 = new int [100];   
  5.         for (int i = 0; i < array1.length; i++) {   
  6.             array1 [i] = i;   
  7.         }   
  8.         int[] array2 = new int [100];   
  9.         System.arraycopy(array1, 0, array2, 0100);   
  10.     }   
  11. }  

public class IRB

{

    void method () {

        int[] array1 = new int [100];

        for (int i = 0; i < array1.length; i++) {

            array1 [i] = i;

        }

        int[] array2 = new int [100];

        System.arraycopy(array1, 0, array2, 0, 100);

    }

}

 


         
参考资料:
http://www.cs.cmu.edu/~jch/java/speed.html

五、让访问实例内变量的getter/setter方法变成”final”


简单的getter/setter方法应该被置成final,这会告诉编译器,这个方法不会被重载,所以,可以变成”inlined”

例子:

Java代码

  1. class MAF {   
  2.     public void setSize (int size) {   
  3.          _size = size;   
  4.     }   
  5.     private int _size;   
  6. }  

class MAF {

    public void setSize (int size) {

         _size = size;

    }

    private int _size;

}

 



更正:

Java代码

  1. class DAF_fixed {   
  2.     final public void setSize (int size) {   
  3.          _size = size;   
  4.     }   
  5.     private int _size;   
  6. }  

class DAF_fixed {

    final public void setSize (int size) {

         _size = size;

    }

    private int _size;

}

 



参考资料:
Warren N. and Bishop P. (1999), "Java in Practice", p. 4-5
Addison-Wesley, ISBN 0-201-36065-9

六、避免不需要的instanceof操作


如果左边的对象的静态类型等于右边的,instanceof表达式返回永远为true
         
例子:

Java代码

  1. public class UISO {   
  2.     public UISO () {}   
  3. }   
  4. class Dog extends UISO {   
  5.     void method (Dog dog, UISO u) {   
  6.         Dog d = dog;   
  7.         if (d instanceof UISO) // always true.   
  8.             System.out.println("Dog is a UISO");   
  9.         UISO uiso = u;   
  10.         if (uiso instanceof Object) // always true.   
  11.             System.out.println("uiso is an Object");   
  12.     }   
  13. }  

public class UISO {

    public UISO () {}

}

class Dog extends UISO {

    void method (Dog dog, UISO u) {

        Dog d = dog;

        if (d instanceof UISO) // always true.

            System.out.println("Dog is a UISO");

        UISO uiso = u;

        if (uiso instanceof Object) // always true.

            System.out.println("uiso is an Object");

    }

}

 


         
更正:         
删掉不需要的instanceof操作。

Java代码

  1. class Dog extends UISO {   
  2.     void method () {   
  3.         Dog d;   
  4.         System.out.println ("Dog is an UISO");   
  5.         System.out.println ("UISO is an UISO");   
  6.     }   
  7. }  

class Dog extends UISO {

    void method () {

        Dog d;

        System.out.println ("Dog is an UISO");

        System.out.println ("UISO is an UISO");

    }

}

 

 

七、避免不需要的造型操作


所有的类都是直接或者间接继承自Object。同样,所有的子类也都隐含的等于其父类。那么,由子类造型至父类的操作就是不必要的了。
例子:

Java代码

  1. class UNC {   
  2.     String _id = "UNC";   
  3. }   
  4. class Dog extends UNC {   
  5.     void method () {   
  6.         Dog dog = new Dog ();   
  7.         UNC animal = (UNC)dog;  // not necessary.   
  8.         Object o = (Object)dog;         // not necessary.   
  9.     }   
  10. }  

class UNC {

    String _id = "UNC";

}

class Dog extends UNC {

    void method () {

        Dog dog = new Dog ();

        UNC animal = (UNC)dog;  // not necessary.

        Object o = (Object)dog;         // not necessary.

    }

}

 


         
更正:

Java代码

  1. class Dog extends UNC {   
  2.     void method () {   
  3.         Dog dog = new Dog();   
  4.         UNC animal = dog;   
  5.         Object o = dog;   
  6.     }   
  7. }  

class Dog extends UNC {

    void method () {

        Dog dog = new Dog();

        UNC animal = dog;

        Object o = dog;

    }

}

 


         
参考资料:
Nigel Warren, Philip Bishop: "Java in Practice - Design Styles and Idioms
for Effective Java".  Addison-Wesley, 1999. pp.22-23

八、如果只是查找单个字符的话,用charAt()代替startsWith()


用一个字符作为参数调用startsWith()也会工作的很好,但从性能角度上来看,调用用String API无疑是错误的!
         
例子:

Java

分享到:
评论

相关推荐

    java程序性能优化

    java程序性能优化Java是目前应用最为广泛的软件开发平台,学习针对Java程序的优化方法有重要的现实意义。《Java程序性能优化:让你的Java程序更快、更稳定》以Java性能调优为主线,系统地阐述了与Java性能优化相关的...

    《Java程序性能优化》(葛一鸣)PDF版本下载.txt

    根据提供的文件信息,我们可以推断出这是一本关于Java程序性能优化的书籍,作者是葛一鸣,并提供了该书PDF版本的下载链接。虽然没有具体的书籍内容,但基于标题、描述以及通常这类书籍会涉及的主题,我们可以总结出...

    Java程序性能优化 让你的Java程序更快、更稳定附本书示例代码(清晰版)

    Java程序性能优化是每个开发人员都需要关注的重要领域,特别是在企业级应用中,高效稳定的Java程序能够显著提升用户体验,降低服务器资源消耗。这本书“Java程序性能优化 让你的Java程序更快、更稳定”提供了深入的...

    Java程序性能优化 让你的Java程序更快、更稳定

    Java程序性能优化是每个开发人员都需要关注的重要领域,它涵盖了多个方面,旨在提高代码执行效率,减少资源消耗,以及提升应用程序的稳定性和响应速度。在本文中,我们将深入探讨Java性能优化的关键点,帮助你的Java...

    JAVA程序性能优化

    ### JAVA程序性能优化 在Java开发中,程序性能优化是一个重要的环节,它直接影响到应用程序的运行效率、用户体验以及系统的整体稳定性。本文将基于提供的标题、描述及部分内容,深入探讨几个关键性的性能优化策略。...

    Java程序性能优化 让你的Java程序更快、更稳定pdf文档视频资源

    Java程序性能优化是每个开发人员都需要关注的重要领域,特别是在企业级应用中,高效稳定的Java程序能够带来显著的业务优势。本资源包含一个PDF文档和相关的视频教程,旨在帮助你提升Java程序的速度和稳定性。 首先...

    Java程序性能优化.rar

    这份资料"Java程序性能优化.rar"包含了高清文档和书籍源码,为我们提供了深入学习和实践Java性能优化的机会。 1. **JVM调优** - **垃圾回收(Garbage Collection)**:理解不同的GC算法,如Serial、Parallel、CMS...

    Java程序性能优化.葛一鸣.2012.10.第1版

    《Java程序性能优化》是葛一鸣在2012年10月出版的第一版专著,这本书深入探讨了如何提升Java应用程序的运行效率和性能。在Java开发中,性能优化是一个关键领域,它涉及到代码的高效编写、内存管理、线程调度、数据库...

    java程序性能优化-pdf+源码

    《Java程序性能优化》这本书是Java开发者不可或缺的参考资料,它深入浅出地讲解了如何提升Java应用程序的效率和稳定性。本书结合理论与实践,既包含了基础的性能优化原则,也探讨了高级的优化技巧,适合从初级到中级...

    JAVA程序性能优化 带书签

    Java程序性能优化 让你的Java程序更快、更稳定 高清 目录 完整

    Java程序性能优化(23条).

    ### Java程序性能优化知识点 #### 一、避免在循环条件中使用复杂表达式 在Java程序中,尤其是在不做编译优化的情况下,如果在循环条件中使用了复杂的表达式,那么这个表达式会在每次循环时被重新计算。这种重复计算...

    《Java程序性能优化:让你的Java程序更快、更稳定》完整扫描PDF版网盘链接

    一个优秀的程序员,不仅要会编写程序,更要会编写高质量的程序,感受Java开发中的大智慧,让你的Java程序更优美 专注于Java应用程序的优化方法、技巧和思想,深入剖析软件设计层面、代码层面、JVM虚拟机层面的优化...

Global site tag (gtag.js) - Google Analytics