JAVA性能调优- try/catch块和循环

1、JAVA性能调优-将try/catch块移出循环

据说把try/catch块放入循环体内,会极大的影响性能。因为使用了try/catch模块的使用,会让JAVA虚拟机做很多额外的工作。就好比对每个人说,“嗨,哥们,路上可能有蛇。于是听到的人只好手拿木棍,小心翼翼的往前走”。

把try/catch块放到循环外面,就好比对一大群人说,“嗨,兄弟们,路上可能有蛇。于是听到的人安排部分人员拿木棍往前走,其他人基本不受影响”

这个理论蛮不错的,测试下对性能的实际影响

2、将try/catch块在循环条件进行比对的源代码

package com.java.test;

import java.util.ArrayList;

import java.util.List;

/**

* 使用预热模式 JVM参数:-XX:PrintCompilation

* 目标:测试在循环中使用try/catch对性能的影响

*

* @author 范芳铭

*/

public class EasyTryCatchTest {

List<String>aList = new ArrayList<String>();

public staticvoid main(String[] args) throws Exception {

intwarmUpCycles = 10000000; //
预热次数

inttestCycles   = 50000000; //
正式执行次数

EasyTryCatchTestse = new EasyTryCatchTest();

System.out.println("...预热循环开始 ...");

longcatchTime = se.runCatchLoop(warmUpCycles);

longnotcatchTime = se.runCatchNotLoop(warmUpCycles);

System.out.println("...预热结束");

System.out.println("...预热阶段,try/catch在循环中耗时: " + catchTime);

System.out.println("...预热阶段,try/catch不在循环中耗时: " + notcatchTime);

System.out.println("...进入正式循环 ...");

catchTime =se.runCatchLoop(testCycles);

notcatchTime= se.runCatchNotLoop(testCycles);

System.out.println("...正式运行阶段,try/catch在循环中耗时: " + catchTime);

System.out.println("...正式运行阶段,try/catch不在循环中耗时: " + notcatchTime);

}

publicEasyTryCatchTest(){

aList.add("0");

}

// try / catch 在具体的循环体(内圈 循环 )中

private longrunCatchLoop(int iterations) {

// 开始计时

longstartTime = System.nanoTime();

for (intloop = 0; loop < iterations; loop++) {

try {

Stringtemp = aList.get(0);

} catch(Exception e) {}

}

// 计时完成

longelapsedTime = System.nanoTime();

return(elapsedTime - startTime);

}

// try / catch 在不在具体的循环体(内圈 循环 )中

public longrunCatchNotLoop(int iterations) {

// 开始计时

longstartTime = System.nanoTime();

try {

for (intloop = 0; loop < iterations; loop++) {

Stringtemp = aList.get(0);

}

} catch(Exception e) {}

// 计时完成

longelapsedTime = System.nanoTime();

return(elapsedTime - startTime);

}

}

3、运行结果

...预热循环开始 ...

...预热结束

...预热阶段,try/catch在循环中耗时: 76507316

...预热阶段,try/catch不在循环中耗时: 76292613

...进入正式循环 ...

...正式运行阶段,try/catch在循环中耗时: 389151690

...正式运行阶段,try/catch不在循环中耗时: 389874615

 

4、结论

从测试结果来看,可能我们的JDK(1.6)会自动优化字节码的缘故,因此try/catch是否在循环中,对整体性能的影响几乎微乎其微,389151690 389874615 差距非常的小。

因此,在实际工作中,可以考虑根据实际需要,把try catch块放在需要的地方。

 

    

时间: 2024-10-16 16:28:10

JAVA性能调优- try/catch块和循环的相关文章

Java性能调优笔记

Java性能调优笔记 调优步骤:衡量系统现状.设定调优目标.寻找性能瓶颈.性能调优.衡量是否到达目标(如果未到达目标,需重新寻找性能瓶颈).性能调优结束. 寻找性能瓶颈 性能瓶颈的表象:资源消耗过多.外部处理系统的性能不足.资源消耗不多但程序的响应速度却仍达不到要求. 资源消耗:CPU.文件IO.网络IO.内存. 外部处理系统的性能不足:所调用的其他系统提供的功能或数据库操作的响应速度不够. 资源消耗不多但程序的响应速度却仍达不到要求:程序代码运行效率不够高.未充分使用资源.程序结构不合理. C

java 性能调优工具

1.jstack 用法jstack [option] pid -l long listings,会打印出额外的锁信息,在发生死锁时可以用jstack -l pid来观察锁持有情况 -m mixed mode,不仅会输出Java堆栈信息,还会输出C/C++堆栈信息(比如Native方法) 找出进程内最耗费CPU的线程,可以使用ps -Lfp pid或者ps -mp pid -o THREAD, tid, time或者top -Hp pid printf "%x\n" pid 得到pid的

java 性能调优和GC

JAVA 性能调优和GC http://blog.csdn.net/gzh0222/article/details/7663181 JAVA GC调优手记 http://blog.csdn.net/firecoder/article/details/7225654 JAVA GC 日志详解 http://blog.csdn.net/alivetime/article/details/6895537 JAVA 内存参数设置 http://heipark.iteye.com/blog/1356113

JAVA性能调优-在循环条件中不要使用表达式

1.JAVA性能调优-在循环条件中不要使用表达式 我们在学习JAVA性能调优的时候,经常能看到这一的一段话:在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快. import java.util.vector; class cel { void method(vector vector) { for (int i= 0; i < vector.size (); i++)  //violation ; //... } } 更正:

Java性能调优_深入Java程序性能调优(并行开发、JVM调优)

深入Java程序性能调优(阿姆达尔定律.缓存组件.并行开发.线程池.JVM调优)课程讲师:special课程分类:Java核心适合人群:初级课时数量:33课时更新程度:完成用到技术:阿姆达尔定律.缓存组件.并行开发.线程池.JVM调优涉及项目:模式在实际开发中运用深入Java程序性能调优下载: http://pan.baidu.com/s/1ntn0ZTB 密码: ijluJava性能调优:国内关于Java性能调优的课程非常少,如此全面深入介绍Java性能调优,北风算是独家,Special讲师,

推荐书籍:《Java性能调优指南》

本书作者是Java性能和Java HotSpot 虚拟机领域的佼佼者,帮助你利用现代软工实践提高性实战生涯中总结能,避免常见错误,从技巧和窍门. 利用G1克服并行.串行和CMS垃圾收集器的局限性了解G1  GC收集的各个阶段,包括年轻代和老年代在G1的引擎下微调您的应用程序确定潜在优化方案,解释实验结果,并付诸行动探索的HotSpot虚拟机内部使用热点VM服务代理分析.分流,并解决不同的热点 <Java性能调优指南>主要展示了如何在当今先进的多核硬件和复杂的操作系统环境下,系统且主动地提高Ja

java性能调优——技客时间

一.java性能调优的标准 cpu:有的应用需要大量计算,他们会长时间.不间断地占用 CPU 资源,导致其他资源无法争夺到 CPU 而响应缓慢,从而带来系统性能问题.例如,代码递归导致的无限循环,正则表达式引起的回溯,JVM 频繁的 FULL GC,以及多线程编程造成的大量上下文切换等,这些都有可能导致 CPU 资源繁忙. 内存:Java 程序一般通过 JVM 对内存进行分配管理,主要是用 JVM 中的堆内存来存储 Java 创建的对象.系统堆内存的读写速度非常快,所以基本不存在读写性能瓶颈.但

Java性能调优

一.类和对象使用技巧 1.尽量少用new生成新对象 用new创建类的实例时,构造雨数链中所有构造函数都会被自动调用,操作速度较慢.在某些时候可复用现有对象.比如在进行大量St rillg操作时,可用StringBuffer娄代替String类,以避免生成大量的对象.用 new关键词创建类的实例时,构造函数链中的所有构造函数都会被自动调用.但如果一个对象实现了 Cloneable 接口,我们可以调用她的 clone() 方法.clone()方法不会调用任何类构造函数. 下面是 Factory 模式

《Java性能调优》学习笔记(1)

性能的参考指标 执行时间 -- 从代码开始运行到结束的时间 CPU时间 -- 函数或者线程占用CPU的时间 内存分配 -- 程序在运行时占用内存的情况 磁盘吞吐量 -- 描述IO的使用情况 网络吞吐量 -- 描述网络的使用情况 响应时间 -- 系统对某用户行为或者时间做出的响应时间 性能的瓶颈资源可能有: 磁盘IO 网络操作 CPU 异常 -- 对Java应用来说,异常的补货和处理是非常消耗资源的,如果程序高频率的对异常处理会对整体性能有影响 数据库 锁竞争 -- 增加上下文切换的开销 内存 性