首页 > 代码库 > JAVA性能调优-在循环条件中不要使用表达式
JAVA性能调优-在循环条件中不要使用表达式
1、JAVA性能调优-在循环条件中不要使用表达式
我们在学习JAVA性能调优的时候,经常能看到这一的一段话:在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快。
import java.util.vector;
class cel {
void method(vector vector) {
for (int i= 0; i < vector.size (); i++) //violation
; //...
}
}
更正:
class cel_fixed {
void method(vector vector) {
int size =vector.size ()
for (int i= 0; i < size; i++)
; //...
}
}
逻辑上看起来非常有道理,只是效率的提升大概有多少,用代码来测试下:
2、循环条件中是否有表达式对比测试的源代码
package com.java.test;
import java.util.ArrayList;
import java.util.List;
/**
* 使用预热模式
* JVM参数:-XX:PrintCompilation
* 目标:测试在循环中,循环条件会被反复计算对性能的影响
* @author 范芳铭
*/
public class EasyLoopParamTest {
List<String>aList = new ArrayList<String>();
public staticvoid main(String[] args) throws Exception{
intwarmUpCycles = 100000; //预热次数
inttestCycles = 200000; //正式执行次数
EasyLoopParamTestse = new EasyLoopParamTest();
System.out.println("...预热循环开始 ...");
longcomputeTime = se.runComputeParam(warmUpCycles);
long fixTime= se.runFixParam(warmUpCycles);
System.out.println("...预热结束");
System.out.println("...预热阶段,动态计算循环调整的平均耗时: " + computeTime);
System.out.println("...预热阶段,固定参数的平均耗时:" + fixTime);
System.out.println("...进入正式循环 ...");
computeTime= se.runComputeParam(testCycles);
fixTime =se.runFixParam(testCycles);
System.out.println("...正式运行阶段,动态计算循环调整的平均耗时: " + computeTime);
System.out.println("...正式运行阶段,固定参数的平均耗时:" + fixTime);
}
//给队列中加入1万个元素
publicEasyLoopParamTest(){
for (inti=0; i< 10000 ; i ++){
aList.add(String.valueOf(i));
}
}
//一个在循环中,循环条件会被反复计算
private longrunComputeParam(int iterations){
//开始计时
longstartTime = System.nanoTime();
for(int loop= 0 ; loop < iterations ; loop ++){
for (inti = 0; i < aList.size(); i++){
//简化内部逻辑
}
}
//计时完成
longelapsedTime = System.nanoTime();
return(elapsedTime - startTime) / iterations;
}
//另外一个在循环中,循环条件不变
public longrunFixParam(int iterations){
//开始计时
longstartTime = System.nanoTime();
int size =aList.size();
for(int loop= 0 ; loop < iterations ; loop ++){
for (inti = 0; i < size; i++){
//简化内部逻辑
}
}
//计时完成
longelapsedTime = System.nanoTime();
return(elapsedTime - startTime) / iterations;
}
}
3、运行结果
...预热循环开始 ...
...预热结束
...预热阶段,动态计算循环调整的平均耗时: 60456
...预热阶段,固定参数的平均耗时: 3537
...进入正式循环 ...
...正式运行阶段,动态计算循环调整的平均耗时: 41578
...正式运行阶段,固定参数的平均耗时: 3493
4、结论
在循环中,循环条件会被反复计算,如果不使用复杂表达式,那么效率的提升是11倍多。
如果在应用中有大量类似的循环,经过这个小小调整,系统的整体性能都会有可观的提升。
JAVA性能调优-在循环条件中不要使用表达式