为什么 Java System.timeNano() 显示的时间相同?
Why Java System.timeNano() shows the same time?
我想用下面的代码运行测试一些排序算法的时间
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 秒 运行。我想我使用了 Java 文档中描述的 nanoTime() 。我搜索了这个问题的答案,似乎人们也遇到过类似的问题。例如,这里
Is there a stopwatch in Java?。但是,我找不到如何解决问题的答案。有人建议使用 apache 的 StopWatch,但据我了解,它使用对 nanoTime() 的类似调用。
那么,如何解决这个问题呢?如果它有所作为,我正在 运行 将 Windows 7 中的代码与 jre 1.8.0_31 结合起来。谢谢
您看到的都是相同的数字,因为您正在使用 integer division 将纳秒转换为毫秒,这具有除以它然后截断所有小数位的效果。
尝试更改:
elapsedTime/1000000
至:
elapsedTime/1000000d
得到包括小数位的结果,这样你就得到小数毫秒。
您还可以通过将对排序的调用替换为 Thread.sleep(50);
来验证循环的计时 - 您应该会看到循环的每次迭代都略微超过 50 毫秒。
好吧,看起来答案很简单,排序算法在每种情况下的运行速度都快于一毫秒,我的整数除法将其四舍五入为零。我为自己的愚蠢道歉:)
更新代码
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
我想用下面的代码运行测试一些排序算法的时间
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 秒 运行。我想我使用了 Java 文档中描述的 nanoTime() 。我搜索了这个问题的答案,似乎人们也遇到过类似的问题。例如,这里 Is there a stopwatch in Java?。但是,我找不到如何解决问题的答案。有人建议使用 apache 的 StopWatch,但据我了解,它使用对 nanoTime() 的类似调用。 那么,如何解决这个问题呢?如果它有所作为,我正在 运行 将 Windows 7 中的代码与 jre 1.8.0_31 结合起来。谢谢
您看到的都是相同的数字,因为您正在使用 integer division 将纳秒转换为毫秒,这具有除以它然后截断所有小数位的效果。
尝试更改:
elapsedTime/1000000
至:
elapsedTime/1000000d
得到包括小数位的结果,这样你就得到小数毫秒。
您还可以通过将对排序的调用替换为 Thread.sleep(50);
来验证循环的计时 - 您应该会看到循环的每次迭代都略微超过 50 毫秒。
好吧,看起来答案很简单,排序算法在每种情况下的运行速度都快于一毫秒,我的整数除法将其四舍五入为零。我为自己的愚蠢道歉:)
更新代码
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