Java 数字越大,为什么运行时间越短
我编写了一个程序名来测试try-catch块是否影响运行时间。 代码如下所示Java 数字越大,为什么运行时间越短,java,exception,try-catch,Java,Exception,Try Catch,我编写了一个程序名来测试try-catch块是否影响运行时间。 代码如下所示 public class ExceptionTest { public static void main(String[] args) { System.out.println("Loop\t\tNormal(nano second)\t\tException(nano second)"); int[] arr = new int[] { 1, 500, 2500, 12500,
public class ExceptionTest {
public static void main(String[] args) {
System.out.println("Loop\t\tNormal(nano second)\t\tException(nano second)");
int[] arr = new int[] { 1, 500, 2500, 12500, 62500, 312500, 16562500 };
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i] + "," + NormalCase(arr[i]) + ","
+ ExceptionCase(arr[i]));
}
}
public static long NormalCase(int times) {
long firstTime=System.nanoTime();
for (int i = 0; i < times; i++) {
int a = i + 1;
int b = 2;
a = a / b;
}
return System.nanoTime()-firstTime;
}
public static long ExceptionCase(int times) {
long firstTime =System.nanoTime();
for (int i = 0; i < times; i++) {
try {
int a = i + 1;
int b = 0;
a = a / b;
} catch (Exception ex) {
}
}
return System.nanoTime()-firstTime;
}
}
公共类例外测试{
公共静态void main(字符串[]args){
System.out.println(“循环\t\t正常(纳秒)\t\t异常(纳秒)”;
int[]arr=新的int[]{1500、2500、12500、62500、312500、16562500};
对于(int i=0;i
结果表明:
我想知道为什么当轮到62500和更大的数字时,时间会更少?它会溢出吗?似乎不是 您没有测试
try/catch
块的计算开销。您确实在测试异常处理的成本。公平的测试是使b=2代码>也在例外情况中
。我不知道如果你认为你只是在测试try/catch
,你会得出什么极端错误的结论。坦率地说,我很震惊
时间变化如此之大的原因是您执行函数的次数如此之多,以至于JVM决定编译和优化它们。把你的环围成一个外环
for(int e= 0 ; e < 17 ; e++ ) {
for(int i= 0 ; i < arr.length ; i++) {
System.out.println(arr[i] + "," + NormalCase(arr[i]) + "," + ExceptionCase(arr[i]));
}
}
您可以使用NormalCase(arr[i],result)
调用它,前面是声明int[]result=newint[1]代码>。以相同的方式修改异常情况
,并输出结果[0]
,以避免任何其他优化。对于每个函数,您可能需要一个result
变量。相关:,请注意规则1到4。为了快速改进,请在您现在所做的每件事情周围添加一个外部循环,该循环至少重复整个测试10次。您还可以使用无止境循环,并在看到数字稳定后手动终止。非常感谢。我想知道如果发生异常,将花费多少时间。我没有很好地描述它。对此表示抱歉。@waylife OK。我担心您没有意识到这一点,并得出结论认为try/catch
是邪恶的或类似的东西:-)
public static long NormalCase(int times,int[] result) {
long firstTime=System.nanoTime();
int computation= 0 ;
for(int i= 0; i < times; i++ ) {
int a= i + 1 ;
int b= 2 ;
a= a / b ;
computation+= a ;
}
result[0]= computation ;
return System.nanoTime()-firstTime;
}