`

Java_代码优化

    博客分类:
  • Java
 
阅读更多

via: http://codelog.lofter.com/post/bfe88_1820b6

性能优化(通用)

一、通用篇

  “通用篇”讨论的问题适合于大多数Java应用。

  1.1 不用new关键词创建类的实例

  用new关键词创建类的实例时,构造函数链中的所有构造函数都会被自动调用。但如果一个对象实现了Cloneable接口,我们可以调用它的clone()方法。clone()方法不会调用任何类构造函数。

  在使用设计模式(Design Pattern)的场合,如果用Factory模式创建对象,则改用clone()方法创建新的对象实例非常简单。例如,下面是Factory模式的一个典型实现:

  public static Credit getNewCredit(){

   return new Credit();

  }

  改进后的代码使用clone()方法,如下所示:

    private static Credit BaseCredit = new Credit();

  public static Credit getNewCredit() {

   return (Credit) BaseCredit.clone();

  }

  上面的思路对于数组处理同样很有用。

 

  1.2 使用非阻塞I/O

  版本较低的JDK不支持非阻塞I/O API。为避免I/O阻塞,一些应用采用了创建大量线程的办法(在较好的情况下,会使用一个缓冲池)。这种技术可以在许多必须支持并发I/O流的应用中见到,如Web服务器、报价和拍卖应用等。然而,创建Java线程需要相当可观的开销。

  JDK 1.4引入了非阻塞的I/O库(java.nio)。如果应用要求使用版本较早的JDK,在这里有一个支持非阻塞I/O的软件包。

 

  1.3 慎用异常

  异常对性能不利。抛出异常首先要创建一个新的对象。Throwable接口的构造函数调用名为fillInStackTrace()的本地 (Native)方法,fillInStackTrace()方法检查堆栈,收集调用跟踪信息。只要有异常被抛出,VM就必须调整调用堆栈,因为在处理过程中创建了一个新的对象。

  异常只能用于错误处理,不应该用来控制程序流程。

 

  1.4 不要重复初始化变量

  默认情况下,调用类的构造函数时, Java会把变量初始化成确定的值:所有的对象被设置成null,整数变量(byte、short、int、long)设置成0,float和 double变量设置成0.0,逻辑值设置成false。当一个类从另一个类派生时,这一点尤其应该注意,因为用new关键词创建一个对象时,构造函数链中的所有构造函数都会被自动调用。

 

  1.5 尽量指定类的final修饰符

  带有final修饰符的类是不可派生的。在Java核心API中,有许多应用final的例子,例如java.lang.String。为String类指定final防止了人们覆盖length()方法。

  另外,如果指定一个类为final,则该类所有的方法都是final。Java编译器会寻找机会内联(inline)所有的final方法(这和具体的编译器实现有关)。此举能够使性能平均提高50%。

 

  1.6 尽量使用局部变量

  调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快。其他变量,如静态变量、实例变量等,都在堆(Heap)中创建,速度较慢。另外,依赖于具体的编译器/JVM,局部变量还可能得到进一步优化。请参见《尽可能使用堆栈变量》。

 

  1.7 乘法和除法

  考虑下面的代码:

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

 

----------------------------------------------------------------------

via: http://codelog.lofter.com/post/bfe88_1820d1

 

Java编程中写出好代码的建议

最近在做应用的性能优化,在review代码的过程中积累了一些规则和经验。做到这些规则的目的很简单,就是写出“优美”的代码来。

 

1、注释尽可能全面

对于方法的注释应该包含详细的入参和结果说明,有异常抛出的情况也要详细叙述;类的注释应该包含类的功能说明、作者和修改者。

 

2、多次使用的相同变量最好归纳成常量

多处使用的相同值的变量应该尽量归纳为一个常量,方便日后的维护。

 

3、尽量少的在循环中执行方法调用

尽量在循环中少做一些可避免的方法调用,这样可以节省方法栈的创建。例如:

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

  System.out.println(i);  

可以修改为:

for(int i=0,size=list.size();i<size;i++){  

  System.out.println(i);  

 

4、常量的定义可以放到接口中

在Java中,接口里只允许存在常量,因此把常量放到接口中声明就可以省去public static final这几个关键词。

 

5、ArrayList和LinkedList的选择

这个问题比较常见。通常程序员最好能够对list的使用场景做出评估,然后根据特性作出选择。ArrayList底层是使用数组实现的,因此随机读取数据会比LinkedList快很多,而LinkedList是使用链表实现的,新增和删除数据的速度比ArrayList快不少。

 

6、String,StringBuffer和StringBuilder

这个问题也比较常见。在进行字符串拼接处理的时候,String通常会产生多个对象,而且将多个值缓存到常量池中。例如:

String a="a";  

String b="b";  

a=a+b; 

这种情况下jvm会产生"a","b","ab"三个对象。而且字符串拼接的性能也很低。因此通常需要做字符串处理的时候尽量采用StringBuffer和StringBuilder来。

 

7、包装类和基本类型的选择

在代码中,如果可以使用基本数据类型来做局部变量类型的话尽量使用基本数据类型,因为基本类型的变量是存放在栈中的,包装类的变量是在堆中,栈的操作速度比堆快很多。

 

8、尽早的将不再使用的变量引用赋给null

这样做可以帮助jvm更快的进行内存回收。当然很多人其实对这种做法并不感冒。

 

9、在finally块中对资源进行释放

典型的场景是使用io流的时候,不论是否出现异常最后都应该在finally中对流进行关闭。

 

10、在HashMap中使用一个Object作为key时要注意如何区分Object是否相同

在jdk的HashMap实现中,判断两个Object类型的key是否相同的标准是hashcode是否相同和equals方法的返回值。如果业务上需要对两个数据相同的内存对象当作不同的key存储到hashmap中就要对hashcode和equals方法进行覆盖。

 

 

----------------------------------------------------------------------

via: http://codelog.lofter.com/post/bfe88_1820c0

 

让Java代码跑得更快

本文简单介绍一下在写代码过程中用到的一些让JAVA代码更高效的技巧。

 

1,将一些系统资源放在池中,如数据库连接,线程等.在standalone的应用中,数据库连接池可以使用一些开源的连接池实现,如C3P0,proxool和DBCP等,在运行在容器中的应用这可以使用服务器提供的DataSource.线程池可以使用JDK本身就提供的java.util.concurrent.ExecutorService.

 

import java.util.concurrent.Executors;  

import java.util.concurrent.ExecutorService;  

public class JavaThreadPool {  

    public static void main(String[] args) {  

    ExecutorService pool = Executors.newFixedThreadPool(2);  

      

    Thread t1 = new MyThread();  

    Thread t2 = new MyThread();  

    Thread t3 = new MyThread();  

    Thread t4 = new MyThread();  

    Thread t5 = new MyThread();  

 

    pool.execute(t1);  

    pool.execute(t2);  

    pool.execute(t3);  

    pool.execute(t4);  

 

    pool.shutdown();  

    }  

}  

 

class MyThread extends Thread {  

    public void run() {  

    System.out.println(Thread.currentThread().getName() + "running....");  

    }  

}  

2,减少网络开销,在和数据库或者远程服务交互的时候,尽量将多次调用合并到一次调用中。

 

3,将经常访问的外部资源cache到内存中,简单的可以使用static的hashmap在应用启动的时候加载,也可以使用一些开源的cache框架,如OSCache和Ehcache等.和资源的同步可以考虑定期轮询和外部资源更新时候主动通知.或者在自己写的代码中留出接口(命令方式或者界面方式)共手动同步。

 

4,优化IO操作,JAVA操作文件的时候分InputStream and OutputStream,Reader and Writer两类,stream的方式要快,后者主要是为了操作字符而用的,在字符仅仅是ASCII的时候可以用stream的方式提高效率.JDK1.4之后的nio比io的效率更好。

OutputStream out = new BufferedOutputStream(new FileOutputStream(new File("d:/temp/test.txt")));              

out.write("abcde".getBytes());        

out.flush();  

out.close(); 

利用BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter减少对磁盘的直接访问次数。

FileReader fr = new FileReader(f);  

BufferedReader br = new BufferedReader(fr);  

while (br.readLine() != null) count++; 

 

5不要频繁的new对象,对于在整个应用中只需要存在一个实例的类使用单例模式.对于String的连接操作,使用StringBuffer或者StringBuilder.对于utility类型的类通过静态方法来访问。

 

6,避免使用错误的方式,如Exception可以控制方法推出,但是Exception要保留stacktrace消耗性能,除非必要不要使用instanceof做条件判断,尽量使用比的条件判断方式.使用JAVA中效率高的类,比如ArrayList比Vector性能好。

 

7,对性能的考虑要在系统分析和设计之初就要考虑。

总之,一个系统运行时的性能,无非是从CPU,Memory和IO这三个主要方面来考虑优化.减少不必要的CPU消耗,减少不必要的IO操作,增加Memory利用效率。

分享到:
评论

相关推荐

    JAVA代码优化工具

    Java代码优化是提升应用程序性能的关键步骤,尤其是在大型企业级应用或者高性能服务中。优化能够减少内存消耗,提高程序运行速度,降低CPU使用率,并改善整体的用户体验。在Java开发领域,有多种工具可以帮助开发者...

    CPlus_to_Java_Converter;C++转java工具

    本文将围绕“CPlus_to_Java_Converter”这一工具,探讨如何将C++代码转换为Java代码,并分析这一过程中涉及的关键技术和挑战。 首先,我们要明确C++到Java的转换并非简单的语法替换,因为两者的语言特性差异显著。...

    CRMEB小程序商城 JAVA_v2.0公测版,CRMEB_JAVA_BETA_v2.0(20211211).zip

    java代码分包 商城和管理api分别部署,可实现集群。 webPC管理端 UI大更新,有风格和更多菜单布局 。 webPC 管理端 操作步骤新增 新手安装引导(更加清晰明了)。 webPC 管理端 新增 行为验证码 增强账户安全。 Java...

    java_class2java.rar_class2java_java_class2java

    此外,如果原始源代码经过混淆或其他优化处理,反编译后的代码可能会更加难以理解。 总的来说,这个压缩包提供了一系列工具,帮助开发者在没有源代码的情况下理解和调试Java字节码,对于学习、维护或逆向工程Java...

    JAVA代码优化.txt

    JAVA代码优化 JAVA代码优化 JAVA代码优化 JAVA代码优化 JAVA代码优化

    差分进化算法的 Java 实现_java_代码_下载

    Storn & Price 的差分进化算法的 Java 实现。 另外使用 Metropolis 算法来估计参数的不确定性。...目前,差分进化算法可用于优化 6 种模型中的任何一种: 更多详情、使用方法,请下载后阅读README.md文件

    独立支持 QCOM 的 Iris FM_java_代码_下载

    在深入了解这个Java代码库之前,我们需要知道以下关键知识点: 1. **Java在Android中的作用**:Java是Android开发的主要语言,提供丰富的类库和API,用于构建应用程序和系统服务。 2. **硬件抽象层(HAL)**:HAL是...

    证件识别_ocr_代码_Android_Java_Demo

    本项目"证件识别_ocr_代码_Android_Java_Demo"提供了一个示例,帮助开发者了解如何在Android平台上实现身份证等证件的文字识别功能。 首先,OCR技术的核心是利用算法和模型来识别图像中的文字,将图像转换成可编辑...

    爱心树java源码_java代码爱心_java编程爱心_java表白源码_java表白代码_表白代码_

    9. **算法优化**:为了保证性能,代码可能会采用一些优化技巧,比如预计算部分数据,减少不必要的计算,或者利用空间换时间的策略。 通过这个"爱心树"的Java源码,初学者不仅可以学习到基础的编程概念,还能了解到...

    用蚁群优化算法 解决流水车间调度问题_java_代码_下载

    用于解决该问题的蚁群算法基于 Max-Min Ant System 实现的流程具有以下特点: 我们有专门的 Ants 来构建可能的解决方案,同时遍历问题图。每个解决方案的质量由其制造跨度表示。 Ant 构建解决方案后,会使用本地...

    Java_SRC_7-9.rar_java s_java 文本编辑器_java_src_javasrc_jdk src

    对于经验丰富的开发者,这可能是探索JDK内部机制和优化代码的机会。 "jdk_src"则指的是JDK(Java Development Kit)的源码。JDK是开发和运行Java应用程序的基础,包含了Java运行时环境、开发工具以及相关的文档。...

    java_dhx 代码使用范例

    在这个“java_dhx 代码使用范例”中,我们将探讨如何在Java环境中利用DHX的功能。 1. **树形结构**: - 在Java_dhx 中,创建树形结构通常涉及到初始化树对象,设置节点数据,以及处理用户交互事件。例如,你可以...

    Java_java_lzma_finder_

    Java_LZMA_Finder是一个专为Java开发者设计的工具,用于在源代码中搜索和处理LZMA(Lempel-Ziv-Markov chain algorithm)压缩格式的相关内容。LZMA是一种高效的压缩算法,常用于数据压缩和存档,尤其在开源社区中...

    code_java_自动代码生成_

    在IT行业中,自动代码生成是一种常见的提升开发效率的手段,特别是在Java MVC框架中。本话题主要探讨的是如何利用工具或自定义脚本来根据数据库表配置信息,自动生成Java MVC架构中的service、dao、MyBatis配置文件...

    JAVA_database.rar_SQL java_SQL java 认证_access_java sql_连接池

    总的来说,这个资源包提供了一套学习Java数据库编程的材料,包括使用SQL语句、通过JDBC API操作数据库,以及使用连接池优化数据库访问性能。对于初学者和有经验的开发者来说,都是很好的学习和参考资源。通过深入...

    PSO.rar_JAVA 可视化_PSO_PSO-BP_pso java_算法 函数优化

    这表明该压缩包内含用Java语言实现的粒子群优化(PSO, Particle Swarm Optimization)算法,以及其在函数优化中的应用。PSO是一种全局优化算法,常用于解决多维空间中的复杂问题,如函数最小化。"PSO-BP"可能指的是...

    fft.java.rar_fft java_fft.java_hyper_java fft_transform

    标题中的"fft.java.rar_fft java_fft.java_hyper_java fft_transform"提到了一个与Java相关的快速傅里叶变换(FFT)程序,可能是一个实现FFT算法的Java源代码文件。描述中的"Fast fourier transform"进一步确认了这...

    最新版Alibaba_Java_Coding_Guidelines-2.0.2.zip离线包

    在Java开发领域,遵循一定的编码规范显得尤为重要,因为它不仅可以提升代码的可读性,还能确保团队之间的代码风格统一,从而提高协作效率。阿里巴巴作为中国领先的互联网公司,其发布的《Alibaba Java Coding ...

    pso_java.rar_Java PSO_PSO_pso java_pso java_pso_JAVA

    【标题】"pso_java.rar" 提到的是一...总之,"pso_java.rar"提供的Java代码为理解和实践粒子群优化算法提供了一个很好的起点。通过深入研究和应用,可以增强对全局优化问题解决的理解,并为实际项目提供有价值的工具。

    Java版Winzip(1).rar_JAVA WIN 1.5_Java win.zip_Java_W_Java_Win_压缩软

    "java_win_1.5"标签表明这个软件是针对Java 1.5版本进行编译和优化的,意味着它可能利用了Java 1.5引入的一些高级特性,如泛型、枚举、静态导入等,以提高代码的可读性和效率。 在压缩方面,"压缩程度显著"描述表明...

Global site tag (gtag.js) - Google Analytics