2

我想用下面的代码测试一些排序算法的运行时间

int n = 2000;
for(int i=0; i<10; i++){
    n *= 2;
    init(array, n); // initializes array with n elements
    long startTime = System.nanoTime();
    sort(array;
    long elapsedTime = System.nanoTime()-startTime;
    System.out.println("Size: "+n+"\t\tTime: "+elapsedTime/1000000+"(ms)");         
}

输出是

Size: 4000      Time: 0(ms)
Size: 8000      Time: 0(ms)
Size: 16000     Time: 0(ms)
Size: 32000     Time: 0(ms)
Size: 64000     Time: 0(ms)
Size: 128000    Time: 0(ms)
Size: 256000    Time: 0(ms)
Size: 512000    Time: 0(ms)
Size: 1024000   Time: 0(ms)
Size: 2048000   Time: 0(ms)

问题不在于算法,它正确地对数组进行排序,并且为大型数组完成这项工作需要相当长的时间。此示例运行大约需要 10 秒。我想我使用了 nanoTime(),就像 Java 文档中描述的那样。我搜索了这个问题的答案,似乎人们遇到了类似的问题。例如,这里 Java 中有秒表吗?. 但是,我找不到如何解决问题的答案。有人建议使用 apache 的 StopWatch,但据我了解,它使用了对 nanoTime() 的类似调用。那么,如何解决这个问题呢?如果它有所作为,我正在使用 jre 1.8.0_31 在 Windows 7 中运行代码。谢谢

4

2 回答 2

4

您看到所有相同的数字,因为您使用整数除法将纳秒转换为毫秒,这具有将其除以然后截断任何小数位的效果。

尝试改变:

elapsedTime/1000000

至:

elapsedTime/1000000d

得到包括小数位的结果,所以你得到小数毫秒。

您还可以通过用 a 替换对 sort 的调用来验证循环的时间Thread.sleep(50);- 您应该会看到循环的每次迭代花费略超过 50 毫秒。

于 2015-06-02T04:15:38.497 回答
1

好吧,看起来答案很简单,排序算法在每种情况下的运行速度都快于一毫秒,而我的整数除法将其舍入为零。我为自己的愚蠢道歉:)

更新代码

int n = 2000;
for(int i=0; i<10; i++){
    n *= 2;
    int maxN = 500;
    init(array, n, maxN);
    long startTime = System.nanoTime();
    sort(array, 0, array.length-1); 
    long endTime = System.nanoTime();
    int elapsedTime = (int) (endTime-startTime);
    System.out.println("Size: "+n+"\t\tTime: "+elapsedTime+"(ns)"+
                "\t\tStart Time: "+startTime+
                "\t\tEnd Time: "+endTime);          
}

显示输出

Size: 4000      Time: 15822(ns)     Start Time: 699563217433713     End Time: 699563217449535
Size: 8000      Time: 3849(ns)      Start Time: 699563218239780     End Time: 699563218243629
Size: 16000     Time: 4276(ns)      Start Time: 699563219213047     End Time: 699563219217323
Size: 32000     Time: 3421(ns)      Start Time: 699563220704592     End Time: 699563220708013
Size: 64000     Time: 9835(ns)      Start Time: 699563222929081     End Time: 699563222938916
Size: 128000        Time: 3849(ns)      Start Time: 699563227085137     End Time: 699563227088986
Size: 256000        Time: 3849(ns)      Start Time: 699563234049813     End Time: 699563234053662
Size: 512000        Time: 5987(ns)      Start Time: 699563247567366     End Time: 699563247573353
Size: 1024000       Time: 8980(ns)      Start Time: 699563274115410     End Time: 699563274124390
Size: 2048000       Time: 8125(ns)      Start Time: 699563326704767     End Time: 699563326712892
于 2015-06-02T04:21:19.537 回答