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

为何用System.currentTimeMillis()计算素数算法耗时出现0ms?

为什么素数测试的第二种方法用System.currentTimeMillis()得到0ms耗时?

我在执行素数算法耗时测试时遇到问题,代码如下:

/**
 * How to determine whether a given integer is prime number Compare time
 */

public class PrimeAlgorithmComparison2 {
    /**
    * Is the given natural number prime number?
    * First method
    * @paramn A given natural number
    * @return If it's a prime number, it's true, otherwise it's false.
     */
    public static boolean isPrime(long n) {
  
        boolean isPrime = true;

        for (long i = 2; i < n; i++) {
            if (n % i == 0) {
                isPrime = false;
                break;
            }
        }
        return isPrime;
    }
    
    /**
     * Is the given natural number prime number?
     * Second method
     * @param n A given natural number
     * @return If it's a prime number, it's true, otherwise it's false.
     */
    public static boolean isPrime2(long n) {
  

        boolean isPrime = true;

        for (long i = 2; i * i <= n; i++) {
            if (n % i == 0) {
                isPrime = false;
                break;
            }
        }
        
        return isPrime;
    }

    public static void main(String[] args) {
        long n = 3033333343L;

        long startTime;
        long endTime;

      
        startTime = System.currentTimeMillis();
        boolean result1 = isPrime(n);
        endTime = System.currentTimeMillis();
        System.out.println("First method, calculation time: " + (endTime - startTime) + "ms");
        System.out.println(n + " is a prime number: " + result1);
     

        startTime = System.currentTimeMillis();
        boolean result2 = isPrime2(n);
        endTime = System.currentTimeMillis();
        System.out.println("Second method, calculation time: " + (endTime - startTime) + "ms");
        System.out.println(n + " is a prime number: " + result2);
    }
}

自行运行后的结果如下:

First method, calculation time: 6907ms
3033333343 is a prime number: true
Second method, calculation time: 0ms
3033333343 is a prime number: true

对比两种方法,第二种方法耗时显示为0ms,单独打印起止时间未发现异常。我知道可以用nanoTime()计算,但不想更换System.currentTimeMillis(),想了解为何计算起止时间差会得到0ms的结果?


原因分析

  • System.currentTimeMillis()的精度限制:这个方法的时间精度是毫秒级,只能捕捉到至少1毫秒的时间差。如果代码执行时间小于1毫秒,起止时间戳会完全相同,差值自然为0。
  • 第二种方法的执行速度极快:第二种方法的循环上限是√n,对于n=3033333343来说,√n约为55075,循环仅需迭代五万多次即可完成,这个过程在现代CPU上完全能在1毫秒内跑完,所以currentTimeMillis()检测不到时间变化。
  • 系统时钟未更新:就算单独打印起止时间,两次调用System.currentTimeMillis()的间隔太短,系统的毫秒级时钟还没走到下一个刻度,因此两个时间值完全一致,差值为0。

内容的提问来源于stack exchange,提问作者Programmer Noob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 23:42:46