0
public class FactorFinder{
  public static void main(String[] args) {      
    long n = ((long)Integer.MAX_VALUE+1)*2;
    boolean isPrime=true;

    for(long i=2;i<=n/2;i++){
        if(n%i==0){
            System.out.println(i + " is a factor of " + n);
            isPrime = false;
        }   
    }    
    if(isPrime == true) System.out.println(n+ " is a prime number");   
  }     
}      

我编写了上面的代码来查找因子 n,或者如果它没有任何因子打印“n 是素数”。我在代码中临时设置了 n=2^32 以查看程序完全运行需要多长时间。花了1分17秒。

然后我将for循环更改为

for(long i=2;i<n;i++){

并预计完成该程序所需的时间是原来的两倍。如您所料,既然您已经阅读了我的问题,只花了 1 分 17 秒。

我是否认为处理器能够以某种方式知道在 n 大于 2^32 / 2 之后,它不必再运行循环了,或者即使它运行了,它也不必检查if 语句的条件了吗?

我有一个在 Windows 7 上运行的 Intel core i3、JDK 1.7.0。

4

2 回答 2

1

我机器上的 n/2 版本花费了一半的时间。编译器不可能足够聪明,无法弄清楚您正在考虑的优化类型。

你记得在第二次测试之前保存源文件并重新编译吗?忘记这一点可以解释你得到的结果,我想不出还有什么可以解释的。

于 2012-11-18T07:11:17.560 回答
0

如果编译器不尝试执行不必要的计算,这是非常聪明的,因为没有必要检查 n 是否可被 i 整除,如果 i > root(n)

于 2013-03-08T08:08:47.670 回答