为何用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
相关产品推荐
相关产品推荐

