平均运行时间远低于1次运行时间

时间:2018-10-16 21:46:41

标签: java runtime

src/test/java

所以我有这段代码可以测量repeatString的运行时间

public class Runtime {
    public static void main(String[] args) {
        int[] n = {1,100,1000,10000};

        for (int i=0; i<4; i++) {
            StringRepeater s = new StringRepeater();

            long start = System.nanoTime();
            s.repeatString("hello", n[i]);
            long stop = System.nanoTime();

            long runtime = stop - start;
            System.out.println("T(" + n[i] + ") = " + runtime/1000000000.0 + " seconds");
        }

        for (int i=0; i<4; i++) {
            long start = 0;
            long stop = 0;
            long runtime100 = 0;

            for (int j=0; j<100; j++) {
                StringRepeater s = new StringRepeater();

                start = System.nanoTime();
                s.repeatString("hello", n[i]);
                stop = System.nanoTime();

                runtime100 = runtime100 + (stop - start);
            }

        System.out.println("T(" + n[i] + ") = " + runtime100/100000000000.0 + " seconds");
        }
    }
}

带有1 for循环的顶部计算1次运行的运行时间。具有2 for循环的底部计算基于100的平均值。但是由于某些原因,第二部分的运行时间通常要快得多,特别是对于较低的n。对于n = 1,它甚至快100倍。

public class StringRepeater {
    public String repeatString(String s, int n){
        String result = "";
    for(int i=0; i<n; i++) {
        result = result + s;
    }
    return result;
    }
} 

这是关于典型收益的信息。我的代码错误还是有其他事情发生。 TL:DL为什么平均运行时间比1x运行时间低很多?您希望它与之相当相似吗?

1 个答案:

答案 0 :(得分:0)

有很多事情需要注意:

  1. 最好避免分割来监视执行时间,因为您可能会遇到精度问题。因此,第一个建议是:将速度时间保持在十亿分之一秒之内。

  2. 性能差异可能是由于及时编译所致:编译器首次执行代码时,需要一些时间来即时编译字节码。仅为了说明这一点,只需尝试反转代码中的循环即可。我帮你做

    public class Runtime {
    public static void main(String[] args) {
        int[] n = { 1, 100, 1000, 10000 };
    
        for (int i = 0; i < 4; i++) {
            long start = 0;
            long stop = 0;
            long runtime100 = 0;
    
            for (int j = 0; j < 100; j++) {
                StringRepeater s = new StringRepeater();
    
                start = System.nanoTime();
                s.repeatString("hello", n[i]);
                stop = System.nanoTime();
    
                runtime100 = runtime100 + (stop - start);
            }
    
            System.out.println("T(" + n[i] + ") = " + runtime100 / 100.0 + " seconds");
        }
    
        for (int i = 0; i < 4; i++) {
            StringRepeater s = new StringRepeater();
    
            long start = System.nanoTime();
            s.repeatString("hello", n[i]);
            long stop = System.nanoTime();
    
            long runtime = stop - start;
            //System.out.println("T(" + n[i] + ") = " + runtime / 1000000000.0 + " seconds");
            System.out.println("T(" + n[i] + ") = " + runtime  + " seconds");
        }
    
    
    }
    
    public static class StringRepeater {
        public String repeatString(String s, int n) {
            String result = "";
            for (int i = 0; i < n; i++) {
                result = result + s;
            }
            return result;
        }
    }
    }
    

当我在计算机上运行此代码时,将获得以下结果:

T(1) = 985.31 seconds
T(100) = 109439.19 seconds
T(1000) = 2604811.29 seconds
T(10000) = 1.1787790449E8 seconds
T(1) = 821 seconds
T(100) = 18886 seconds
T(1000) = 1099442 seconds
T(10000) = 121750683 seconds

您可以看到,现在的100循环比单轮执行慢。这是因为它是在现在之前执行的。

3-如果您观察到以上结果,您可能会注意到现在的情况与初始情况完全相反。为什么?我认为这是由于垃圾收集器的工作。在更大的周期中,垃圾回收有更多的工作要做,只是因为有很多临时变量要垃圾。

希望对您有帮助。