Java 数字越大,为什么运行时间越短

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,

我编写了一个程序名来测试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, 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;
    }