You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 16:15:45