测试一:测试Java堆栈变量、类变量、实例变量在程序中的执行效率
package t0422;
/*
* 测试堆栈、实例变量、类变量的执行速度
* 用instanceVar和staticVar分别定义实例变量和类变量
* 在getStackTime() 方法体中用了int j=0;来获取一个栈变量
*/
public class ExcuteTimeTest1 {
int instanceVar; //定义实例变量
static int staticVar; //定义类变量
long stackTime; //存放堆栈变量运行的时间
long instanceTime; //存放实例变量运行的时间
long staticTime; //存放静态变量运行的时间
//getStackTime()获取堆栈运算的多次执行时间
long getStackTime(){
long stackStartTime = System.currentTimeMillis();
int j=0;
for(int i=0;i<300000000;i++){
j+=i;
}
long stackEndTime = System.currentTimeMillis();
stackTime=stackEndTime-stackStartTime;
return stackTime;
}
// getInstanceTime()获取实例运算的多次执行时间
long getInstanceTime(){
long instanceStartTime = System.currentTimeMillis();
for(int i=0;i<300000000;i++){
instanceVar+=i;
}
long instanceEndTime = System.currentTimeMillis();
instanceTime=instanceEndTime-instanceStartTime;
return instanceTime;
}
// getStaticTime()获取类变量运算的多次执行时间
long getStaticTime(){
long staticStartTime = System.currentTimeMillis();
for(int i=0;i<300000000;i++){
staticVar+=i;
}
long staticEndTime = System.currentTimeMillis();
staticTime=staticEndTime-staticStartTime;
return staticTime;
}
public static void main(String[] args) {
ExcuteTimeTest1 ett1 = new ExcuteTimeTest1();
System.out.println(ett1.getStackTime()); //打印堆栈变量运算的运行时间
System.out.println(ett1.getInstanceTime()); //打印实例变量运算的运行时间
System.out.println(ett1.getStaticTime()); //打印类变量运算的运行时间
}
}
//数值单位都是毫秒
/*第一次
422
1172
1187*/
/*第二次
500
1406
1500*/
/*第三次
469
1266
1172*/
总结1:通过三次的测试,可以看出堆栈变量运算的执行时间要远远少于其他两种变量的执行时间,但是堆栈变量对外部代码块几乎是没有什么意义。
测试二:同测试一,除过在代码快中将类变量、实例变量的值赋给快中一个堆栈变量
package t0422;
/*
* 测试堆栈、实例变量、类变量的执行速度
* 用instanceVar和staticVar分别定义实例变量和类变量
* 在getStackTime() 方法体中用了int j=0;来获取一个栈变量
*/
public class ExcuteTimeTest2 {
int instanceVar; //定义实例变量
static int staticVar; //定义类变量
long stackTime; //存放堆栈变量运行的时间
long instanceTime; //存放实例变量运行的时间
long staticTime; //存放静态变量运行的时间
//getStackTime()获取堆栈运算的多次执行时间
long getStackTime(){
long stackStartTime = System.currentTimeMillis();
int j=0;
for(int i=0;i<300000000;i++){
j+=i;
}
long stackEndTime = System.currentTimeMillis();
stackTime=stackEndTime-stackStartTime;
return stackTime;
}
// getInstanceTime()获取实例运算的多次执行时间
long getInstanceTime(){
long instanceStartTime = System.currentTimeMillis();
int j=instanceVar; //将
for(int i=0;i<300000000;i++){
j+=i;
}
j=instanceVar;
long instanceEndTime = System.currentTimeMillis();
instanceTime=instanceEndTime-instanceStartTime;
return instanceTime;
}
// getStaticTime()获取类变量运算的多次执行时间
long getStaticTime(){
long staticStartTime = System.currentTimeMillis();
int j=staticVar;
for(int i=0;i<300000000;i++){
j+=i;
}
j=staticVar;
long staticEndTime = System.currentTimeMillis();
staticTime=staticEndTime-staticStartTime;
return staticTime;
}
public static void main(String[] args) {
ExcuteTimeTest2 ett2 = new ExcuteTimeTest2();
System.out.println(ett2.getStackTime()); //打印堆栈变量运算的运行时间
System.out.println(ett2.getInstanceTime()); //打印实例变量运算的运行时间
System.out.println(ett2.getStaticTime()); //打印类变量运算的运行时间
}
}
//执行结果(单位:毫秒)
/*第一次
406
407
406*/
/*第二次
516
500
515*/
/*第三次
422
406
407*/
总结2:通过三次测试的结果可以看出,将定义好的实例变量和类变量在代码块中赋值给一个堆栈变量的话,可以大量提升运算速率。
下雨了,闷在家无聊,就做了这个测试,虽然我现在还碰不到运算次数达到300000000的那种运算,呵呵,但是让我知道了定义代码块中的局部变量是很好的做法,另外顺便练了下System.currentTimeMillis()那个方法。