本来是为了测算java异常的时间开销,但从测算结果中发现了一些问题,现把原文发在这里,请大家看看,原因何在!!!(顺序有些颠倒)测算异常的时间开销/*************************后记提前了********************************************
【后记】:
同样,从上面的结果似乎可以得出这样的一个结论:如果处理的对象个数足够多,那么Vector的时间开销会少于用足够大的数组存储这些对象。这好像与我一直认为的利用数组存储对象的效率要高于利用Vector存储对象的效率相矛盾。原因何在???
********************************************************************************/每抛出一个异常,JVM必须挂起正常的程序运行,查找并运行一个异常处理程序。所有这些都需要时间。那么,java的异常处理需要多少时间开销?【目的】:测试java中异常的时间开销
【场景】:假设有一应用程序,必须把一些对象保存在内存中,但对象的数量并不知道。
这里给出三种解决问题的方案:1。选取Vector2。使用一个最初有N个元素的数组。如果插入N个对象,那么该数组不会发生异常3。使用一个初始个数为0的数组。插入N个对象的话,将出现N次异常
【测试环境】:1。Windows XP with SP22。CPU:PIII 900MHz 内存:256M3。Java version:1.4.2_04【算法设计】:
如何实现,这里不详细叙述了。代码很少,相信大家一看就能明白。import java.util.Vector;public class ExceptionOveload {
//需要加入元素的个数
public static final int N=20000;
private double vectorTime;
private double arrayWithOTime;
private double arrayWithNTime;
private Vector vector;
private Integer[] array;
private void insertAt(int k){
try{
array[k]=new Integer(k);
}
catch(ArrayIndexOutOfBoundsException e){
Integer[] newarray = new Integer[array.length + 1];
for(int i=0;i<array.length;i++)
newarray[i] = array[i];
newarray[array.length] = new Integer(k);
array = newarray;
}
}
public void testVector(int N){
//测试vector中加入N个元素的系统开销
long startTime,endTime;
vector = new Vector(0);
startTime = System.currentTimeMillis();
for(int i=0;i<N;i++){
vector.addElement(new Integer(i));
}
endTime = System.currentTimeMillis();
vectorTime = endTime - startTime;
}
public void testArrayWithO(int N){
//测试0个元素的数组中加入N个元素的系统开销
long startTime,endTime;
array = new Integer[0];
startTime = System.currentTimeMillis();
for(int i=0;i<N;i++)
insertAt(i);
endTime = System.currentTimeMillis();
arrayWithOTime = (double)(endTime - startTime);
}
public void testArrayWithN(int N){
//测试N个元素的数组中加入N个元素的系统开销
long startTime,endTime;
array = new Integer[N];
startTime = System.currentTimeMillis();
for(int i=0;i<N;i++)
insertAt(i);
endTime = System.currentTimeMillis();
arrayWithNTime = (double)(endTime - startTime);
}
public void show(){
System.out.println("Insert " + N + " elements into:");
System.out.println(" Vector in " + vectorTime + " millisecond");
System.out.println(" Array with 0 element in " + arrayWithOTime + " milliseconds");
System.out.println(" Array with " + N + " elements in " + arrayWithNTime + " milliseconds");
}
public static void main(String argv[]){
ExceptionOveload e = new ExceptionOveload();
e.testVector(ExceptionOveload.N);
e.testArrayWithO(ExceptionOveload.N);
e.testArrayWithN(ExceptionOveload.N);
e.show();
}
}【实验结果】:
Insert 20000 elements into:
Vector in 40.0 millisecond
Array with 0 element in 26548.0 milliseconds
Array with 20000 elements in 0.0 millisecondsInsert 40000 elements into:
Vector in 50.0 millisecond
Array with 0 element in 136797.0 milliseconds
Array with 40000 elements in 80.0 millisecondsInsert 60000 elements into:
Vector in 80.0 millisecond
Array with 0 element in 370112.0 milliseconds
Array with 60000 elements in 120.0 milliseconds【结论】:
从上面的实验可以看出,异常的时间开销异常的大。因此在设计中,最好只用异常处理机制捕捉真正的异常,而不要利用异常机制来弥补设计上的缺陷,否则,得不偿失!!!
【后记】:
同样,从上面的结果似乎可以得出这样的一个结论:如果处理的对象个数足够多,那么Vector的时间开销会少于用足够大的数组存储这些对象。这好像与我一直认为的利用数组存储对象的效率要高于利用Vector存储对象的效率相矛盾。原因何在???
********************************************************************************/每抛出一个异常,JVM必须挂起正常的程序运行,查找并运行一个异常处理程序。所有这些都需要时间。那么,java的异常处理需要多少时间开销?【目的】:测试java中异常的时间开销
【场景】:假设有一应用程序,必须把一些对象保存在内存中,但对象的数量并不知道。
这里给出三种解决问题的方案:1。选取Vector2。使用一个最初有N个元素的数组。如果插入N个对象,那么该数组不会发生异常3。使用一个初始个数为0的数组。插入N个对象的话,将出现N次异常
【测试环境】:1。Windows XP with SP22。CPU:PIII 900MHz 内存:256M3。Java version:1.4.2_04【算法设计】:
如何实现,这里不详细叙述了。代码很少,相信大家一看就能明白。import java.util.Vector;public class ExceptionOveload {
//需要加入元素的个数
public static final int N=20000;
private double vectorTime;
private double arrayWithOTime;
private double arrayWithNTime;
private Vector vector;
private Integer[] array;
private void insertAt(int k){
try{
array[k]=new Integer(k);
}
catch(ArrayIndexOutOfBoundsException e){
Integer[] newarray = new Integer[array.length + 1];
for(int i=0;i<array.length;i++)
newarray[i] = array[i];
newarray[array.length] = new Integer(k);
array = newarray;
}
}
public void testVector(int N){
//测试vector中加入N个元素的系统开销
long startTime,endTime;
vector = new Vector(0);
startTime = System.currentTimeMillis();
for(int i=0;i<N;i++){
vector.addElement(new Integer(i));
}
endTime = System.currentTimeMillis();
vectorTime = endTime - startTime;
}
public void testArrayWithO(int N){
//测试0个元素的数组中加入N个元素的系统开销
long startTime,endTime;
array = new Integer[0];
startTime = System.currentTimeMillis();
for(int i=0;i<N;i++)
insertAt(i);
endTime = System.currentTimeMillis();
arrayWithOTime = (double)(endTime - startTime);
}
public void testArrayWithN(int N){
//测试N个元素的数组中加入N个元素的系统开销
long startTime,endTime;
array = new Integer[N];
startTime = System.currentTimeMillis();
for(int i=0;i<N;i++)
insertAt(i);
endTime = System.currentTimeMillis();
arrayWithNTime = (double)(endTime - startTime);
}
public void show(){
System.out.println("Insert " + N + " elements into:");
System.out.println(" Vector in " + vectorTime + " millisecond");
System.out.println(" Array with 0 element in " + arrayWithOTime + " milliseconds");
System.out.println(" Array with " + N + " elements in " + arrayWithNTime + " milliseconds");
}
public static void main(String argv[]){
ExceptionOveload e = new ExceptionOveload();
e.testVector(ExceptionOveload.N);
e.testArrayWithO(ExceptionOveload.N);
e.testArrayWithN(ExceptionOveload.N);
e.show();
}
}【实验结果】:
Insert 20000 elements into:
Vector in 40.0 millisecond
Array with 0 element in 26548.0 milliseconds
Array with 20000 elements in 0.0 millisecondsInsert 40000 elements into:
Vector in 50.0 millisecond
Array with 0 element in 136797.0 milliseconds
Array with 40000 elements in 80.0 millisecondsInsert 60000 elements into:
Vector in 80.0 millisecond
Array with 0 element in 370112.0 milliseconds
Array with 60000 elements in 120.0 milliseconds【结论】:
从上面的实验可以看出,异常的时间开销异常的大。因此在设计中,最好只用异常处理机制捕捉真正的异常,而不要利用异常机制来弥补设计上的缺陷,否则,得不偿失!!!
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货