Java使用System.currentTimeMillis()统计数组排序耗时输出为0
问题根因
统计结果始终为0是两个因素共同导致的:
- 你使用的
System.currentTimeMillis()是毫秒级精度的时间接口,返回值是从1970年1月1日UTC零点到当前时刻的毫秒数,最小计量粒度就是1毫秒。如果你测试用的数组长度不大,插入排序的执行速度极快,整体耗时不足1毫秒,两次取到的时间戳差值自然就是0。 - 插入排序虽然是O(n²)复杂度的排序算法,但当数组长度只有几十、几百的时候,CPU执行这段逻辑只需要几百甚至几十纳秒,远小于毫秒级计时的最小粒度,根本无法被毫秒计时器捕捉到。
可行解决方案
- 替换计时API:使用JDK提供的纳秒级计时方法
System.nanoTime(),这个方法就是专门为代码段耗时统计设计的,精度可达纳秒级(1ms = 1000000ns),可以捕捉到极短的执行耗时。 - 调整测试规模:把测试数组的长度适当调高,比如设置为10000、100000,让排序执行的总耗时拉长到毫秒级以上,哪怕用毫秒计时也能得到非0结果。
- 严谨测试不要单次运行:如果要得到稳定可信的性能数据,不要只跑一次排序就统计耗时,可以循环执行几十上百次,排除JIT即时编译、CPU调度波动的干扰,取平均耗时作为结果。
修改后的代码示例
public static void main(String[] args) { // 示例:将数组长度设为10000,保证排序有可观测的耗时 int[] array1 = new int[10000]; int[] array2 = new int[10000]; for ( int b = 0; b < array1.length; b++) { int n = (int)(Integer.MAX_VALUE * Math.random()); array1[b] = n; array2[b] = n; } // 换用纳秒级计时 long startTime = System.nanoTime(); insertionSort(array1); long runTime = System.nanoTime() - startTime; // 同时输出纳秒和转成毫秒的结果,方便查看 System.out.printf("The runtime of the sorting is %d ns, approximately %.2f ms%n", runTime, runTime / 1_000_000.0); }
注意:
System.nanoTime()返回的不是系统时钟时间,是JVM维护的高分辨率计时偏移值,仅能用来计算两个时间点的差值,不能用来做日期、时刻相关的计算,完全匹配耗时统计的使用场景。
内容的提问来源于stack exchange,提问作者Santiago Hernandez
相关产品推荐
相关产品推荐

